[ovs-dev] [PATCH] ovsdb: Fix OVSDB disconnect replication bug

Andy Zhou azhou at ovn.org
Mon Aug 1 21:41:00 UTC 2016


From: Mario Cabrera <mario.cabrera at hpe.com>

Currently disconnecting from the replicator server means closing the jsonrpc
connection and destroying the monitored table names and blacklisted table
names.

This patch makes a distition between disconnecting from the remote server,
applicable when the replication incurs in an error, and destroying the
remote server info, applicable when ovsdb-server exits gracefully.

Signed-off-by: Mario Cabrera <mario.cabrera at hpe.com>
---
 ovsdb/ovsdb-server.c |  2 +-
 ovsdb/replication.c  | 17 +++++++++++++----
 ovsdb/replication.h  |  1 +
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c
index 1c6ddca..bb65637 100644
--- a/ovsdb/ovsdb-server.c
+++ b/ovsdb/ovsdb-server.c
@@ -371,7 +371,7 @@ main(int argc, char *argv[])
     sset_destroy(&remotes);
     sset_destroy(&db_filenames);
     unixctl_server_destroy(unixctl);
-    disconnect_remote_server();
+    destroy_remote_server();
 
     if (run_process && process_exited(run_process)) {
         int status = process_status(run_process);
diff --git a/ovsdb/replication.c b/ovsdb/replication.c
index 463fa0a..81211bd 100644
--- a/ovsdb/replication.c
+++ b/ovsdb/replication.c
@@ -142,6 +142,14 @@ void
 disconnect_remote_server(void)
 {
     jsonrpc_close(rpc);
+    sset_clear(&monitored_tables);
+    sset_clear(&tables_blacklist);
+}
+
+void
+destroy_remote_server(void)
+{
+    jsonrpc_close(rpc);
     sset_destroy(&monitored_tables);
     sset_destroy(&tables_blacklist);
 
@@ -452,15 +460,13 @@ process_notification(struct json *table_updates, struct ovsdb *database)
         error = ovsdb_txn_commit(txn, false);
         if (error) {
             ovsdb_error_assert(error);
-            sset_clear(&monitored_tables);
+            disconnect_remote_server();
         }
     } else {
         ovsdb_txn_abort(txn);
         ovsdb_error_assert(error);
-        sset_clear(&monitored_tables);
+        disconnect_remote_server();
     }
-
-    ovsdb_error_destroy(error);
 }
 
 static struct ovsdb_error *
@@ -500,6 +506,9 @@ process_table_update(struct json *table_update, const char *table_name,
                 error = execute_update(txn, node->name, table, new);
             }
         }
+        if (error) {
+            break;
+        }
     }
     return error;
 }
diff --git a/ovsdb/replication.h b/ovsdb/replication.h
index 93ac22b..1b2d3e4 100644
--- a/ovsdb/replication.h
+++ b/ovsdb/replication.h
@@ -37,6 +37,7 @@ const char *get_remote_ovsdb_server(void);
 void set_tables_blacklist(const char *blacklist);
 struct sset get_tables_blacklist(void);
 void disconnect_remote_server(void);
+void destroy_remote_server(void);
 const struct db *find_db(const struct shash *all_dbs, const char *db_name);
 void replication_usage(void);
 
-- 
1.9.1




More information about the dev mailing list