diff --git a/dbutils.c b/dbutils.c index f96e95cd..e9a9b228 100644 --- a/dbutils.c +++ b/dbutils.c @@ -1382,3 +1382,23 @@ update_node_record_set_upstream(PGconn *conn, char *cluster_name, int this_node_ return true; } + + +PGresult * +get_node_record(PGconn *conn, char *cluster, int node_id) +{ + char sqlquery[QUERY_STR_LEN]; + + sprintf(sqlquery, + "SELECT id, upstream_node_id, conninfo, type, slot_name, active " + " FROM %s.repl_nodes " + " WHERE cluster = '%s' " + " AND id = %i", + get_repmgr_schema_quoted(conn), + cluster, + node_id); + + log_debug("get_node_record(): %s\n", sqlquery); + + return PQexec(conn, sqlquery); +} diff --git a/dbutils.h b/dbutils.h index 02653b51..caa4a2fa 100644 --- a/dbutils.h +++ b/dbutils.h @@ -67,5 +67,6 @@ bool create_node_record(PGconn *conn, char *action, int node, char *type, int u bool delete_node_record(PGconn *conn, int node, char *action); bool create_event_record(PGconn *conn, t_configuration_options *options, int node_id, char *event, bool successful, char *details); bool update_node_record_set_upstream(PGconn *conn, char *cluster_name, int this_node_id, int new_upstream_node_id); +PGresult * get_node_record(PGconn *conn, char *cluster, int node_id); #endif diff --git a/repmgr.c b/repmgr.c index 5f75bcef..87bae279 100644 --- a/repmgr.c +++ b/repmgr.c @@ -753,28 +753,38 @@ do_master_register(void) exit(ERR_BAD_CONFIG); } + PQfinish(master_conn); + /* XXX we should check if a node with a different ID is registered as master, otherwise it would be possible to insert a duplicate record with --force, which would result in an unwelcome "multi-master" situation */ - PQfinish(master_conn); /* Delete any existing record for this node if --force set */ if (runtime_options.force) { + PGresult *res; bool node_record_deleted; - log_notice(_("deleting existing master record with id %i\n"), options.node); + begin_transaction(conn); - node_record_deleted = delete_node_record(conn, - options.node, - "master register"); - - if (node_record_deleted == false) + res = get_node_record(conn, options.cluster_name, options.node); + if (PQntuples(res)) { - PQfinish(conn); - exit(ERR_BAD_CONFIG); + log_notice(_("deleting existing master record with id %i\n"), options.node); + + node_record_deleted = delete_node_record(conn, + options.node, + "master register"); + if (node_record_deleted == false) + { + rollback_transaction(conn); + PQfinish(conn); + exit(ERR_BAD_CONFIG); + } } + + commit_transaction(conn); } diff --git a/repmgrd.c b/repmgrd.c index ba5d63ac..c88cbc66 100644 --- a/repmgrd.c +++ b/repmgrd.c @@ -2226,23 +2226,12 @@ check_and_create_pid_file(const char *pid_file) t_node_info get_node_info(PGconn *conn, char *cluster, int node_id) { - char sqlquery[QUERY_STR_LEN]; PGresult *res; t_node_info node_info = { NODE_NOT_FOUND, NO_UPSTREAM_NODE, "", InvalidXLogRecPtr, UNKNOWN, false, false}; - sprintf(sqlquery, - "SELECT id, upstream_node_id, conninfo, type, slot_name, active " - " FROM %s.repl_nodes " - " WHERE cluster = '%s' " - " AND id = %i", - get_repmgr_schema_quoted(conn), - local_options.cluster_name, - node_id); + res = get_node_record(conn, cluster, node_id); - log_debug("get_node_info(): %s\n", sqlquery); - - res = PQexec(my_local_conn, sqlquery); if (PQresultStatus(res) != PGRES_TUPLES_OK) { PQExpBufferData errmsg;