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);