From de5908c122d1ce9ec1aa754a0a7b7b729122d0b8 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 9bc8792d..755982a0 100644 --- a/dbutils.c +++ b/dbutils.c @@ -1125,6 +1125,8 @@ copy_configuration(PGconn *masterconn, PGconn *witnessconn, char *cluster_name) PGresult *res; int i; + begin_transaction(witnessconn); + sqlquery_snprintf(sqlquery, "TRUNCATE TABLE %s.repl_nodes", get_repmgr_schema_quoted(witnessconn)); log_verbose(LOG_DEBUG, "copy_configuration():\n%s\n", sqlquery); @@ -1149,6 +1151,8 @@ copy_configuration(PGconn *masterconn, PGconn *witnessconn, char *cluster_name) 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 @@ copy_configuration(PGconn *masterconn, PGconn *witnessconn, char *cluster_name) 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; }