mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-26 16:46:28 +00:00
Prevent multiple nodes being registered with the same name.
Fixes GitHub #192.
This commit is contained in:
51
dbutils.c
51
dbutils.c
@@ -31,6 +31,7 @@
|
|||||||
char repmgr_schema[MAXLEN] = "";
|
char repmgr_schema[MAXLEN] = "";
|
||||||
char repmgr_schema_quoted[MAXLEN] = "";
|
char repmgr_schema_quoted[MAXLEN] = "";
|
||||||
|
|
||||||
|
static int _get_node_record(PGconn *conn, char *cluster, char *sqlquery, t_node_info *node_info);
|
||||||
|
|
||||||
PGconn *
|
PGconn *
|
||||||
_establish_db_connection(const char *conninfo, const bool exit_on_error, const bool log_notice)
|
_establish_db_connection(const char *conninfo, const bool exit_on_error, const bool log_notice)
|
||||||
@@ -1681,8 +1682,7 @@ int
|
|||||||
get_node_record(PGconn *conn, char *cluster, int node_id, t_node_info *node_info)
|
get_node_record(PGconn *conn, char *cluster, int node_id, t_node_info *node_info)
|
||||||
{
|
{
|
||||||
char sqlquery[QUERY_STR_LEN];
|
char sqlquery[QUERY_STR_LEN];
|
||||||
PGresult *res;
|
int result;
|
||||||
int ntuples;
|
|
||||||
|
|
||||||
sqlquery_snprintf(
|
sqlquery_snprintf(
|
||||||
sqlquery,
|
sqlquery,
|
||||||
@@ -1696,6 +1696,49 @@ get_node_record(PGconn *conn, char *cluster, int node_id, t_node_info *node_info
|
|||||||
|
|
||||||
log_verbose(LOG_DEBUG, "get_node_record():\n%s\n", sqlquery);
|
log_verbose(LOG_DEBUG, "get_node_record():\n%s\n", sqlquery);
|
||||||
|
|
||||||
|
result = _get_node_record(conn, cluster, sqlquery, node_info);
|
||||||
|
|
||||||
|
if (result == 0)
|
||||||
|
{
|
||||||
|
log_verbose(LOG_DEBUG, "get_node_record(): no record found for node %i\n", node_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
get_node_record_by_name(PGconn *conn, char *cluster, const char *node_name, t_node_info *node_info)
|
||||||
|
{
|
||||||
|
char sqlquery[QUERY_STR_LEN];
|
||||||
|
int result;
|
||||||
|
|
||||||
|
sqlquery_snprintf(
|
||||||
|
sqlquery,
|
||||||
|
"SELECT id, type, upstream_node_id, name, conninfo, slot_name, priority, active"
|
||||||
|
" FROM %s.repl_nodes "
|
||||||
|
" WHERE cluster = '%s' "
|
||||||
|
" AND node_name = %s",
|
||||||
|
get_repmgr_schema_quoted(conn),
|
||||||
|
cluster,
|
||||||
|
node_name);
|
||||||
|
|
||||||
|
result = _get_node_record(conn, cluster, sqlquery, node_info);
|
||||||
|
|
||||||
|
if (result == 0)
|
||||||
|
{
|
||||||
|
log_verbose(LOG_DEBUG, "get_node_record(): no record found for node %s\n", node_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int
|
||||||
|
_get_node_record(PGconn *conn, char *cluster, char *sqlquery, t_node_info *node_info)
|
||||||
|
{
|
||||||
|
int ntuples;
|
||||||
|
PGresult *res;
|
||||||
|
|
||||||
res = PQexec(conn, sqlquery);
|
res = PQexec(conn, sqlquery);
|
||||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
{
|
{
|
||||||
@@ -1706,7 +1749,6 @@ get_node_record(PGconn *conn, char *cluster, int node_id, t_node_info *node_info
|
|||||||
|
|
||||||
if (ntuples == 0)
|
if (ntuples == 0)
|
||||||
{
|
{
|
||||||
log_verbose(LOG_DEBUG, "get_node_record(): no record found for node %i\n", node_id);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1727,6 +1769,9 @@ get_node_record(PGconn *conn, char *cluster, int node_id, t_node_info *node_info
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
get_node_replication_state(PGconn *conn, char *node_name, char *output)
|
get_node_replication_state(PGconn *conn, char *node_name, char *output)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -125,6 +125,7 @@ bool witness_copy_node_records(PGconn *masterconn, PGconn *witnessconn, char *c
|
|||||||
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 active);
|
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 active);
|
||||||
bool delete_node_record(PGconn *conn, int node, char *action);
|
bool delete_node_record(PGconn *conn, int node, char *action);
|
||||||
int get_node_record(PGconn *conn, char *cluster, int node_id, t_node_info *node_info);
|
int get_node_record(PGconn *conn, char *cluster, int node_id, t_node_info *node_info);
|
||||||
|
int get_node_record_by_name(PGconn *conn, char *cluster, const char *node_name, t_node_info *node_info);
|
||||||
bool update_node_record_status(PGconn *conn, char *cluster_name, int this_node_id, char *type, int upstream_node_id, bool active);
|
bool update_node_record_status(PGconn *conn, char *cluster_name, int this_node_id, char *type, int upstream_node_id, bool active);
|
||||||
bool update_node_record_set_upstream(PGconn *conn, char *cluster_name, int this_node_id, int new_upstream_node_id);
|
bool update_node_record_set_upstream(PGconn *conn, char *cluster_name, int this_node_id, int new_upstream_node_id);
|
||||||
bool create_event_record(PGconn *conn, t_configuration_options *options, int node_id, char *event, bool successful, char *details);
|
bool create_event_record(PGconn *conn, t_configuration_options *options, int node_id, char *event, bool successful, char *details);
|
||||||
|
|||||||
25
repmgr.c
25
repmgr.c
@@ -1127,8 +1127,9 @@ do_standby_register(void)
|
|||||||
PGconn *master_conn;
|
PGconn *master_conn;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
||||||
bool record_created;
|
bool record_created;
|
||||||
|
t_node_info node_record;
|
||||||
|
int node_result;
|
||||||
|
|
||||||
log_info(_("connecting to standby database\n"));
|
log_info(_("connecting to standby database\n"));
|
||||||
conn = establish_db_connection(options.conninfo, true);
|
conn = establish_db_connection(options.conninfo, true);
|
||||||
@@ -1185,6 +1186,28 @@ do_standby_register(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check that an active node with the same node_name doesn't exist already
|
||||||
|
*/
|
||||||
|
|
||||||
|
node_result = get_node_record_by_name(master_conn,
|
||||||
|
options.cluster_name,
|
||||||
|
options.node_name,
|
||||||
|
&node_record);
|
||||||
|
|
||||||
|
if (node_result)
|
||||||
|
{
|
||||||
|
if (node_record.active == true)
|
||||||
|
{
|
||||||
|
log_err(_("Node %i exists already with node_name \"%s\""),
|
||||||
|
node_record.node_id,
|
||||||
|
options.node_name);
|
||||||
|
PQfinish(master_conn);
|
||||||
|
PQfinish(conn);
|
||||||
|
exit(ERR_BAD_CONFIG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
record_created = create_node_record(master_conn,
|
record_created = create_node_record(master_conn,
|
||||||
"standby register",
|
"standby register",
|
||||||
options.node,
|
options.node,
|
||||||
|
|||||||
Reference in New Issue
Block a user