From c9c5c9e201f1633d51c232a1a7c88da8859f5969 Mon Sep 17 00:00:00 2001 From: Mario Cabrera Date: Tue, 28 Jun 2016 15:14:53 -0600 Subject: [PATCH] ovsdb: Fix OVSDB disconnect replication bug 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 distinction 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 --- ovsdb/ovsdb-server.c | 2 +- ovsdb/replication.c | 32 +++++++++++++++++++++----------- ovsdb/replication.h | 1 + 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/ovsdb/ovsdb-server.c b/ovsdb/ovsdb-server.c index 1c6ddca40..bb65637a5 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 463fa0ad2..f11af702a 100644 --- a/ovsdb/replication.c +++ b/ovsdb/replication.c @@ -140,6 +140,14 @@ get_tables_blacklist(void) 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); @@ -447,20 +455,19 @@ process_notification(struct json *table_updates, struct ovsdb *database) } } - if (!error){ - /* Commit transaction. */ - error = ovsdb_txn_commit(txn, false); - if (error) { - ovsdb_error_assert(error); - sset_clear(&monitored_tables); - } - } else { + if (error) { ovsdb_txn_abort(txn); - ovsdb_error_assert(error); - sset_clear(&monitored_tables); + goto error; } - ovsdb_error_destroy(error); + /* Commit transaction. */ + error = ovsdb_txn_commit(txn, false); + +error: + if (error) { + ovsdb_error_assert(error); + disconnect_remote_server(); + } } static struct ovsdb_error * @@ -500,6 +507,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 93ac22b22..1b2d3e4dc 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);