Check for existing master record before deleting it

Otherwise repmgr implies it's deleting a record which isn't actually
there.
This commit is contained in:
Ian Barwick
2015-09-24 17:39:39 +09:00
parent 43874d5576
commit 8e7d110a22
4 changed files with 41 additions and 21 deletions

View File

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

View File

@@ -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

View File

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

View File

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