diff --git a/dbutils.c b/dbutils.c index 67259ed8..3364a05c 100644 --- a/dbutils.c +++ b/dbutils.c @@ -977,6 +977,7 @@ create_node_record(PGconn *conn, char *action, int node, char *type, int upstrea { log_warning(_("Cannot insert node details, %s\n"), PQerrorMessage(conn)); + PQclear(res); return false; } @@ -984,3 +985,34 @@ create_node_record(PGconn *conn, char *action, int node, char *type, int upstrea return true; } + + +bool +delete_node_record(PGconn *conn, int node, char *action) +{ + char sqlquery[QUERY_STR_LEN]; + PGresult *res; + + sqlquery_snprintf(sqlquery, + "DELETE FROM %s.repl_nodes " + " WHERE id = %d", + get_repmgr_schema_quoted(conn), + node); + if(action != NULL) + { + log_debug(_("%s: %s\n"), action, sqlquery); + } + + res = PQexec(conn, sqlquery); + if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) + { + log_warning(_("Cannot delete node details, %s\n"), + PQerrorMessage(conn)); + PQclear(res); + return false; + } + + PQclear(res); + return true; +} + diff --git a/dbutils.h b/dbutils.h index 7bbfb8b2..9b2aa124 100644 --- a/dbutils.h +++ b/dbutils.h @@ -60,5 +60,8 @@ bool stop_backup(PGconn *conn, char *last_wal_segment); bool set_config_bool(PGconn *conn, const char *config_param, bool state); bool copy_configuration(PGconn *masterconn, PGconn *witnessconn, char *cluster_name); bool create_node_record(PGconn *conn, char *action, int node, char *type, int upstream_node, char *cluster_name, char *node_name, char *conninfo, int priority, char *slot_name); +bool delete_node_record(PGconn *conn, int node, char *action); + + #endif diff --git a/repmgr.c b/repmgr.c index 1761a52e..34f5649f 100644 --- a/repmgr.c +++ b/repmgr.c @@ -670,8 +670,6 @@ static void do_master_register(void) { PGconn *conn; - PGresult *res; - char sqlquery[QUERY_STR_LEN]; bool schema_exists = false; int ret; @@ -721,26 +719,6 @@ do_master_register(void) { PGconn *master_conn; - if (runtime_options.force) - { - sqlquery_snprintf(sqlquery, - "DELETE FROM %s.repl_nodes " - " WHERE id = %d ", - get_repmgr_schema_quoted(conn), - options.node); - log_debug(_("master register: %s\n"), sqlquery); - - res = PQexec(conn, sqlquery); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) - { - log_warning(_("Cannot delete node details, %s\n"), - PQerrorMessage(conn)); - PQfinish(conn); - exit(ERR_BAD_CONFIG); - } - PQclear(res); - } - /* Ensure there isn't any other master already registered */ master_conn = get_master_connection(conn, options.cluster_name, NULL, NULL); @@ -751,6 +729,20 @@ do_master_register(void) options.cluster_name); exit(ERR_BAD_CONFIG); } + + if (runtime_options.force) + { + bool node_record_deleted = delete_node_record(conn, + options.node, + "master register"); + + if (node_record_deleted == false) + { + PQfinish(master_conn); + PQfinish(conn); + exit(ERR_BAD_CONFIG); + } + } } /* Now register the master */ @@ -783,9 +775,6 @@ do_standby_register(void) PGconn *master_conn; int ret; - PGresult *res; - char sqlquery[QUERY_STR_LEN]; - char master_version[MAXVERSIONSTR]; int master_version_num = 0; @@ -794,8 +783,6 @@ do_standby_register(void) bool node_record_created; - /* XXX: A lot of copied code from do_master_register! Refactor */ - log_info(_("%s connecting to standby database\n"), progname); conn = establish_db_connection(options.conninfo, true); @@ -856,24 +843,16 @@ do_standby_register(void) log_info(_("%s registering the standby\n"), progname); if (runtime_options.force) { - sqlquery_snprintf(sqlquery, - "DELETE FROM %s.repl_nodes " - " WHERE id = %d", - get_repmgr_schema_quoted(master_conn), - options.node); + bool node_record_deleted = delete_node_record(master_conn, + options.node, + "standby register"); - log_debug(_("standby register: %s\n"), sqlquery); - - res = PQexec(master_conn, sqlquery); - if (!res || PQresultStatus(res) != PGRES_COMMAND_OK) + if (node_record_deleted == false) { - log_err(_("Cannot delete node details, %s\n"), - PQerrorMessage(master_conn)); PQfinish(master_conn); PQfinish(conn); exit(ERR_BAD_CONFIG); } - PQclear(res); } node_record_created = create_node_record(master_conn,