debian: Don't unload kernel modules in init script on "stop" or "restart".
[openvswitch] / lib / ovsdb-idl.c
index 059682c754b81786bebb380571b9216c9f0b6d00..f72e18762f0857f6e89ed74dd4869c87c1252918 100644 (file)
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 
 #include "bitmap.h"
+#include "dynamic-string.h"
 #include "json.h"
 #include "jsonrpc.h"
 #include "ovsdb-data.h"
@@ -79,6 +80,8 @@ struct ovsdb_idl_txn {
     struct ovsdb_idl *idl;
     struct hmap txn_rows;
     enum ovsdb_idl_txn_status status;
+    bool dry_run;
+    struct ds comment;
 };
 
 static struct vlog_rate_limit syntax_rl = VLOG_RATE_LIMIT_INIT(1, 5);
@@ -791,13 +794,34 @@ ovsdb_idl_txn_create(struct ovsdb_idl *idl)
     txn->idl = idl;
     txn->status = TXN_INCOMPLETE;
     hmap_init(&txn->txn_rows);
+    txn->dry_run = false;
+    ds_init(&txn->comment);
     return txn;
 }
 
+void
+ovsdb_idl_txn_add_comment(struct ovsdb_idl_txn *txn, const char *s)
+{
+    if (txn->comment.length) {
+        ds_put_char(&txn->comment, '\n');
+    }
+    ds_put_cstr(&txn->comment, s);
+}
+
+void
+ovsdb_idl_txn_set_dry_run(struct ovsdb_idl_txn *txn)
+{
+    txn->dry_run = true;
+}
+
 void
 ovsdb_idl_txn_destroy(struct ovsdb_idl_txn *txn)
 {
+    if (txn->status == TXN_INCOMPLETE) {
+        hmap_remove(&txn->idl->outstanding_txns, &txn->hmap_node);
+    }
     ovsdb_idl_txn_abort(txn);
+    ds_destroy(&txn->comment);
     free(txn);
 }
 
@@ -1028,6 +1052,19 @@ ovsdb_idl_txn_commit(struct ovsdb_idl_txn *txn)
         }
     }
 
+    if (txn->comment.length) {
+        struct json *op = json_object_create();
+        json_object_put_string(op, "op", "comment");
+        json_object_put_string(op, "comment", ds_cstr(&txn->comment));
+        json_array_add(operations, op);
+    }
+
+    if (txn->dry_run) {
+        struct json *op = json_object_create();
+        json_object_put_string(op, "op", "abort");
+        json_array_add(operations, op);
+    }
+
     if (!any_updates) {
         txn->status = TXN_SUCCESS;
     } else if (!jsonrpc_session_send(
@@ -1127,11 +1164,8 @@ ovsdb_idl_txn_delete(struct ovsdb_idl_row *row)
         hmap_insert(&row->table->idl->txn->txn_rows, &row->txn_node,
                     uuid_hash(&row->uuid));
     }
-    if (row->new == row->old) {
-        row->new = NULL;
-    } else {
-        ovsdb_idl_row_clear_new(row);
-    }
+    ovsdb_idl_row_clear_new(row);
+    row->new = NULL;
 }
 
 struct ovsdb_idl_row *
@@ -1209,7 +1243,7 @@ ovsdb_idl_txn_process_reply(struct ovsdb_idl *idl,
                     if (error->type == JSON_STRING) {
                         if (!strcmp(error->u.string, "timed out")) {
                             soft_errors++;
-                        } else {
+                        } else if (strcmp(error->u.string, "aborted")) {
                             hard_errors++;
                         }
                     } else {