From 2a8d6f72c61eb6f048e39361e03295807fae1431 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Fri, 1 Apr 2016 11:07:17 +0900 Subject: [PATCH] Make witness server node update an atomic operation If the connection to the primary is lost, roll back to the previously known state. TRUNCATE is of course not MVCC-friendly, but that shouldn't matter here as only one process should ever be looking at this table. --- dbutils.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dbutils.c b/dbutils.c index f3dfd444..834c4d71 100644 --- a/dbutils.c +++ b/dbutils.c @@ -1125,6 +1125,8 @@ witness_copy_node_records(PGconn *masterconn, PGconn *witnessconn, char *cluster PGresult *res; int i; + begin_transaction(witnessconn); + sqlquery_snprintf(sqlquery, "TRUNCATE TABLE %s.repl_nodes", get_repmgr_schema_quoted(witnessconn)); log_verbose(LOG_DEBUG, "witness_copy_node_records():\n%s\n", sqlquery); @@ -1149,6 +1151,8 @@ witness_copy_node_records(PGconn *masterconn, PGconn *witnessconn, char *cluster log_err("Unable to retrieve node records from master:\n%s\n", PQerrorMessage(masterconn)); PQclear(res); + rollback_transaction(witnessconn); + return false; } @@ -1186,11 +1190,15 @@ witness_copy_node_records(PGconn *masterconn, PGconn *witnessconn, char *cluster log_err("Unable to copy node record to witness database\n%s\n", PQerrorMessage(witnessconn)); + rollback_transaction(witnessconn); + return false; } } PQclear(res); + commit_transaction(witnessconn); + return true; }