mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-27 00:46:29 +00:00
Use "primary" instead of "master"
This commit is contained in:
@@ -26,7 +26,7 @@ include Makefile.global
|
|||||||
|
|
||||||
$(info Building against PostgreSQL $(MAJORVERSION))
|
$(info Building against PostgreSQL $(MAJORVERSION))
|
||||||
|
|
||||||
REPMGR_CLIENT_OBJS = repmgr-client.o repmgr-action-master.o repmgr-action-standby.o repmgr-action-cluster.o \
|
REPMGR_CLIENT_OBJS = repmgr-client.o repmgr-action-primary.o repmgr-action-standby.o repmgr-action-cluster.o \
|
||||||
config.o log.o strutil.o dbutils.o dirutil.o compat.o controldata.o
|
config.o log.o strutil.o dbutils.o dirutil.o compat.o controldata.o
|
||||||
REPMGRD_OBJS = repmgrd.o config.o log.o dbutils.o strutil.o
|
REPMGRD_OBJS = repmgrd.o config.o log.o dbutils.o strutil.o
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ maintainer-clean: additional-maintainer-clean
|
|||||||
additional-clean:
|
additional-clean:
|
||||||
rm -f repmgr-client.o
|
rm -f repmgr-client.o
|
||||||
rm -f repmgr-action-cluster.o
|
rm -f repmgr-action-cluster.o
|
||||||
rm -f repmgr-action-master.o
|
rm -f repmgr-action-primary.o
|
||||||
rm -f repmgr-action-standby.o
|
rm -f repmgr-action-standby.o
|
||||||
rm -f repmgrd.o
|
rm -f repmgrd.o
|
||||||
rm -f compat.o
|
rm -f compat.o
|
||||||
|
|||||||
@@ -10,7 +10,8 @@ operations.
|
|||||||
`repmgr 4` is a complete rewrite of the existing `repmgr` codebase.
|
`repmgr 4` is a complete rewrite of the existing `repmgr` codebase.
|
||||||
|
|
||||||
|
|
||||||
Supports PostgreSQL 9.3 and later.
|
Supports PostgreSQL 9.6 and later; support for 9.3 will be dropped, 9.4/9.5
|
||||||
|
may be supported if feasible.
|
||||||
|
|
||||||
Building from source
|
Building from source
|
||||||
--------------------
|
--------------------
|
||||||
@@ -27,8 +28,8 @@ Commands
|
|||||||
|
|
||||||
Currently available:
|
Currently available:
|
||||||
|
|
||||||
repmgr master register
|
repmgr primary register
|
||||||
repmgr master unregister
|
repmgr primary unregister
|
||||||
|
|
||||||
repmgr standby clone
|
repmgr standby clone
|
||||||
repmgr standby register
|
repmgr standby register
|
||||||
@@ -45,7 +46,7 @@ Backwards compatibility
|
|||||||
See also: doc/changes-in-repmgr4.md
|
See also: doc/changes-in-repmgr4.md
|
||||||
|
|
||||||
`repmgr` is now implemented as a PostgreSQL extension. NOTE: no need to
|
`repmgr` is now implemented as a PostgreSQL extension. NOTE: no need to
|
||||||
install the extension, this will be done automatically by `repmgr master register`.
|
install the extension, this will be done automatically by `repmgr primary register`.
|
||||||
|
|
||||||
Metadata tables have been revised and are not backwards-compatible
|
Metadata tables have been revised and are not backwards-compatible
|
||||||
with 3.x. (however future DDL updates will be easier as they can be
|
with 3.x. (however future DDL updates will be easier as they can be
|
||||||
|
|||||||
2
config.c
2
config.c
@@ -234,7 +234,7 @@ _parse_config(t_configuration_options *options, ItemList *error_list, ItemList *
|
|||||||
memset(options->promote_command, 0, sizeof(options->promote_command));
|
memset(options->promote_command, 0, sizeof(options->promote_command));
|
||||||
memset(options->follow_command, 0, sizeof(options->follow_command));
|
memset(options->follow_command, 0, sizeof(options->follow_command));
|
||||||
options->monitor_interval_secs = 2;
|
options->monitor_interval_secs = 2;
|
||||||
options->master_response_timeout = 60;
|
options->primary_response_timeout = 60;
|
||||||
/* default to 6 reconnection attempts at intervals of 10 seconds */
|
/* default to 6 reconnection attempts at intervals of 10 seconds */
|
||||||
options->reconnect_attempts = 6;
|
options->reconnect_attempts = 6;
|
||||||
options->reconnect_interval = 10;
|
options->reconnect_interval = 10;
|
||||||
|
|||||||
2
config.h
2
config.h
@@ -77,7 +77,7 @@ typedef struct
|
|||||||
char promote_command[MAXLEN];
|
char promote_command[MAXLEN];
|
||||||
char follow_command[MAXLEN];
|
char follow_command[MAXLEN];
|
||||||
int monitor_interval_secs;
|
int monitor_interval_secs;
|
||||||
int master_response_timeout;
|
int primary_response_timeout;
|
||||||
int reconnect_attempts;
|
int reconnect_attempts;
|
||||||
int reconnect_interval;
|
int reconnect_interval;
|
||||||
int retry_promote_interval_secs;
|
int retry_promote_interval_secs;
|
||||||
|
|||||||
114
dbutils.c
114
dbutils.c
@@ -19,7 +19,7 @@ static PGconn *_establish_db_connection(const char *conninfo,
|
|||||||
const bool log_notice,
|
const bool log_notice,
|
||||||
const bool verbose_only);
|
const bool verbose_only);
|
||||||
|
|
||||||
static PGconn *_get_master_connection(PGconn *standby_conn, int *master_id, char *master_conninfo_out, bool quiet);
|
static PGconn *_get_primary_connection(PGconn *standby_conn, int *primary_id, char *primary_conninfo_out, bool quiet);
|
||||||
|
|
||||||
static bool _set_config(PGconn *conn, const char *config_param, const char *sqlquery);
|
static bool _set_config(PGconn *conn, const char *config_param, const char *sqlquery);
|
||||||
static RecordStatus _get_node_record(PGconn *conn, char *sqlquery, t_node_info *node_info);
|
static RecordStatus _get_node_record(PGconn *conn, char *sqlquery, t_node_info *node_info);
|
||||||
@@ -127,20 +127,20 @@ establish_db_connection_quiet(const char *conninfo)
|
|||||||
|
|
||||||
|
|
||||||
PGconn
|
PGconn
|
||||||
*establish_master_db_connection(PGconn *conn,
|
*establish_primary_db_connection(PGconn *conn,
|
||||||
const bool exit_on_error)
|
const bool exit_on_error)
|
||||||
{
|
{
|
||||||
t_node_info master_node_info = T_NODE_INFO_INITIALIZER;
|
t_node_info primary_node_info = T_NODE_INFO_INITIALIZER;
|
||||||
bool master_record_found;
|
bool primary_record_found;
|
||||||
|
|
||||||
master_record_found = get_master_node_record(conn, &master_node_info);
|
primary_record_found = get_primary_node_record(conn, &primary_node_info);
|
||||||
|
|
||||||
if (master_record_found == false)
|
if (primary_record_found == false)
|
||||||
{
|
{
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return establish_db_connection(master_node_info.conninfo,
|
return establish_db_connection(primary_node_info.conninfo,
|
||||||
exit_on_error);
|
exit_on_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -858,7 +858,7 @@ RecoveryType
|
|||||||
get_recovery_type(PGconn *conn)
|
get_recovery_type(PGconn *conn)
|
||||||
{
|
{
|
||||||
PGresult *res;
|
PGresult *res;
|
||||||
RecoveryType recovery_type = RECTYPE_MASTER;
|
RecoveryType recovery_type = RECTYPE_PRIMARY;
|
||||||
|
|
||||||
char *sqlquery = "SELECT pg_catalog.pg_is_in_recovery()";
|
char *sqlquery = "SELECT pg_catalog.pg_is_in_recovery()";
|
||||||
|
|
||||||
@@ -889,13 +889,13 @@ get_recovery_type(PGconn *conn)
|
|||||||
* current primary will be returned first, reducing the number of speculative
|
* current primary will be returned first, reducing the number of speculative
|
||||||
* connections which need to be made to other nodes.
|
* connections which need to be made to other nodes.
|
||||||
*
|
*
|
||||||
* If master_conninfo_out points to allocated memory of MAXCONNINFO in length,
|
* If primary_conninfo_out points to allocated memory of MAXCONNINFO in length,
|
||||||
* the primary server's conninfo string will be copied there.
|
* the primary server's conninfo string will be copied there.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
PGconn *
|
PGconn *
|
||||||
_get_master_connection(PGconn *conn,
|
_get_primary_connection(PGconn *conn,
|
||||||
int *master_id, char *master_conninfo_out, bool quiet)
|
int *primary_id, char *primary_conninfo_out, bool quiet)
|
||||||
{
|
{
|
||||||
PQExpBufferData query;
|
PQExpBufferData query;
|
||||||
|
|
||||||
@@ -912,12 +912,12 @@ _get_master_connection(PGconn *conn,
|
|||||||
* If the caller wanted to get a copy of the connection info string, sub
|
* If the caller wanted to get a copy of the connection info string, sub
|
||||||
* out the local stack pointer for the pointer passed by the caller.
|
* out the local stack pointer for the pointer passed by the caller.
|
||||||
*/
|
*/
|
||||||
if (master_conninfo_out != NULL)
|
if (primary_conninfo_out != NULL)
|
||||||
remote_conninfo = master_conninfo_out;
|
remote_conninfo = primary_conninfo_out;
|
||||||
|
|
||||||
if (master_id != NULL)
|
if (primary_id != NULL)
|
||||||
{
|
{
|
||||||
*master_id = NODE_NOT_FOUND;
|
*primary_id = NODE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* find all registered nodes */
|
/* find all registered nodes */
|
||||||
@@ -926,12 +926,12 @@ _get_master_connection(PGconn *conn,
|
|||||||
initPQExpBuffer(&query);
|
initPQExpBuffer(&query);
|
||||||
appendPQExpBuffer(&query,
|
appendPQExpBuffer(&query,
|
||||||
" SELECT node_id, conninfo, "
|
" SELECT node_id, conninfo, "
|
||||||
" CASE WHEN type = 'master' THEN 1 ELSE 2 END AS type_priority"
|
" CASE WHEN type = 'primary' THEN 1 ELSE 2 END AS type_priority"
|
||||||
" FROM repmgr.nodes "
|
" FROM repmgr.nodes "
|
||||||
" WHERE type != 'witness' "
|
" WHERE type != 'witness' "
|
||||||
"ORDER BY active DESC, type_priority, priority, node_id");
|
"ORDER BY active DESC, type_priority, priority, node_id");
|
||||||
|
|
||||||
log_verbose(LOG_DEBUG, "get_master_connection():\n%s", query.data);
|
log_verbose(LOG_DEBUG, "get_primary_connection():\n%s", query.data);
|
||||||
|
|
||||||
res = PQexec(conn, query.data);
|
res = PQexec(conn, query.data);
|
||||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
@@ -978,14 +978,14 @@ _get_master_connection(PGconn *conn,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recovery_type == RECTYPE_MASTER)
|
if (recovery_type == RECTYPE_PRIMARY)
|
||||||
{
|
{
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
log_debug(_("get_master_connection(): current master node is %i"), node_id);
|
log_debug(_("get_primary_connection(): current primary node is %i"), node_id);
|
||||||
|
|
||||||
if (master_id != NULL)
|
if (primary_id != NULL)
|
||||||
{
|
{
|
||||||
*master_id = node_id;
|
*primary_id = node_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
return remote_conn;
|
return remote_conn;
|
||||||
@@ -999,30 +999,30 @@ _get_master_connection(PGconn *conn,
|
|||||||
}
|
}
|
||||||
|
|
||||||
PGconn *
|
PGconn *
|
||||||
get_master_connection(PGconn *conn,
|
get_primary_connection(PGconn *conn,
|
||||||
int *master_id, char *master_conninfo_out)
|
int *primary_id, char *primary_conninfo_out)
|
||||||
{
|
{
|
||||||
return _get_master_connection(conn, master_id, master_conninfo_out, false);
|
return _get_primary_connection(conn, primary_id, primary_conninfo_out, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
PGconn *
|
PGconn *
|
||||||
get_master_connection_quiet(PGconn *conn,
|
get_primary_connection_quiet(PGconn *conn,
|
||||||
int *master_id, char *master_conninfo_out)
|
int *primary_id, char *primary_conninfo_out)
|
||||||
{
|
{
|
||||||
return _get_master_connection(conn, master_id, master_conninfo_out, true);
|
return _get_primary_connection(conn, primary_id, primary_conninfo_out, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the id of the active master node, or NODE_NOT_FOUND if no
|
* Return the id of the active primary node, or NODE_NOT_FOUND if no
|
||||||
* record available.
|
* record available.
|
||||||
*
|
*
|
||||||
* This reports the value stored in the database only and
|
* This reports the value stored in the database only and
|
||||||
* does not verify whether the node is actually available
|
* does not verify whether the node is actually available
|
||||||
*/
|
*/
|
||||||
int
|
int
|
||||||
get_master_node_id(PGconn *conn)
|
get_primary_node_id(PGconn *conn)
|
||||||
{
|
{
|
||||||
PQExpBufferData query;
|
PQExpBufferData query;
|
||||||
PGresult *res;
|
PGresult *res;
|
||||||
@@ -1032,10 +1032,10 @@ get_master_node_id(PGconn *conn)
|
|||||||
appendPQExpBuffer(&query,
|
appendPQExpBuffer(&query,
|
||||||
"SELECT node_id "
|
"SELECT node_id "
|
||||||
" FROM repmgr.nodes "
|
" FROM repmgr.nodes "
|
||||||
" WHERE type = 'master' "
|
" WHERE type = 'primary' "
|
||||||
" AND active IS TRUE ");
|
" AND active IS TRUE ");
|
||||||
|
|
||||||
log_verbose(LOG_DEBUG, "get_master_node_id():\n%s", query.data);
|
log_verbose(LOG_DEBUG, "get_primary_node_id():\n%s", query.data);
|
||||||
|
|
||||||
res = PQexec(conn, query.data);
|
res = PQexec(conn, query.data);
|
||||||
|
|
||||||
@@ -1043,13 +1043,13 @@ get_master_node_id(PGconn *conn)
|
|||||||
|
|
||||||
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
if (PQresultStatus(res) != PGRES_TUPLES_OK)
|
||||||
{
|
{
|
||||||
log_error(_("get_master_node_id(): query failed\n %s"),
|
log_error(_("get_primary_node_id(): query failed\n %s"),
|
||||||
PQerrorMessage(conn));
|
PQerrorMessage(conn));
|
||||||
retval = NODE_NOT_FOUND;
|
retval = NODE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
else if (PQntuples(res) == 0)
|
else if (PQntuples(res) == 0)
|
||||||
{
|
{
|
||||||
log_verbose(LOG_WARNING, _("get_master_node_id(): no active primary found\n"));
|
log_verbose(LOG_WARNING, _("get_primary_node_id(): no active primary found\n"));
|
||||||
retval = NODE_NOT_FOUND;
|
retval = NODE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -1193,9 +1193,9 @@ _populate_node_record(PGresult *res, t_node_info *node_info, int row)
|
|||||||
t_server_type
|
t_server_type
|
||||||
parse_node_type(const char *type)
|
parse_node_type(const char *type)
|
||||||
{
|
{
|
||||||
if (strcmp(type, "master") == 0)
|
if (strcmp(type, "primary") == 0)
|
||||||
{
|
{
|
||||||
return MASTER;
|
return PRIMARY;
|
||||||
}
|
}
|
||||||
else if (strcmp(type, "standby") == 0)
|
else if (strcmp(type, "standby") == 0)
|
||||||
{
|
{
|
||||||
@@ -1218,8 +1218,8 @@ get_node_type_string(t_server_type type)
|
|||||||
{
|
{
|
||||||
switch(type)
|
switch(type)
|
||||||
{
|
{
|
||||||
case MASTER:
|
case PRIMARY:
|
||||||
return "master";
|
return "primary";
|
||||||
case STANDBY:
|
case STANDBY:
|
||||||
return "standby";
|
return "standby";
|
||||||
case WITNESS:
|
case WITNESS:
|
||||||
@@ -1266,7 +1266,7 @@ RecordStatus
|
|||||||
get_node_record_by_name(PGconn *conn, const char *node_name, t_node_info *node_info)
|
get_node_record_by_name(PGconn *conn, const char *node_name, t_node_info *node_info)
|
||||||
{
|
{
|
||||||
PQExpBufferData query;
|
PQExpBufferData query;
|
||||||
RecordStatus result;
|
RecordStatus record_status;
|
||||||
|
|
||||||
initPQExpBuffer(&query);
|
initPQExpBuffer(&query);
|
||||||
|
|
||||||
@@ -1278,31 +1278,31 @@ get_node_record_by_name(PGconn *conn, const char *node_name, t_node_info *node_i
|
|||||||
|
|
||||||
log_verbose(LOG_DEBUG, "get_node_record_by_name():\n %s", query.data);
|
log_verbose(LOG_DEBUG, "get_node_record_by_name():\n %s", query.data);
|
||||||
|
|
||||||
result = _get_node_record(conn, query.data, node_info);
|
record_status = _get_node_record(conn, query.data, node_info);
|
||||||
|
|
||||||
termPQExpBuffer(&query);
|
termPQExpBuffer(&query);
|
||||||
|
|
||||||
if (result == 0)
|
if (record_status == RECORD_NOT_FOUND)
|
||||||
{
|
{
|
||||||
log_verbose(LOG_DEBUG, "get_node_record(): no record found for node %s",
|
log_verbose(LOG_DEBUG, "get_node_record(): no record found for node %s",
|
||||||
node_name);
|
node_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return record_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
get_master_node_record(PGconn *conn, t_node_info *node_info)
|
get_primary_node_record(PGconn *conn, t_node_info *node_info)
|
||||||
{
|
{
|
||||||
int master_node_id = get_master_node_id(conn);
|
int primary_node_id = get_primary_node_id(conn);
|
||||||
|
|
||||||
if (master_node_id == UNKNOWN_NODE_ID)
|
if (primary_node_id == UNKNOWN_NODE_ID)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return get_node_record(conn, master_node_id, node_info);
|
return get_node_record(conn, primary_node_id, node_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1430,7 +1430,7 @@ _create_update_node_record(PGconn *conn, char *action, t_node_info *node_info)
|
|||||||
* No explicit upstream node id provided for standby - attempt to
|
* No explicit upstream node id provided for standby - attempt to
|
||||||
* get primary node id
|
* get primary node id
|
||||||
*/
|
*/
|
||||||
int primary_node_id = get_master_node_id(conn);
|
int primary_node_id = get_primary_node_id(conn);
|
||||||
maxlen_snprintf(upstream_node_id, "%i", primary_node_id);
|
maxlen_snprintf(upstream_node_id, "%i", primary_node_id);
|
||||||
upstream_node_id_ptr = upstream_node_id;
|
upstream_node_id_ptr = upstream_node_id;
|
||||||
}
|
}
|
||||||
@@ -1507,12 +1507,12 @@ _create_update_node_record(PGconn *conn, char *action, t_node_info *node_info)
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
update_node_record_set_master(PGconn *conn, int this_node_id)
|
update_node_record_set_primary(PGconn *conn, int this_node_id)
|
||||||
{
|
{
|
||||||
PQExpBufferData query;
|
PQExpBufferData query;
|
||||||
PGresult *res;
|
PGresult *res;
|
||||||
|
|
||||||
log_debug(_("setting node %i as master and marking existing master as failed"),
|
log_debug(_("setting node %i as primary and marking existing primary as failed"),
|
||||||
this_node_id);
|
this_node_id);
|
||||||
|
|
||||||
begin_transaction(conn);
|
begin_transaction(conn);
|
||||||
@@ -1522,14 +1522,14 @@ update_node_record_set_master(PGconn *conn, int this_node_id)
|
|||||||
appendPQExpBuffer(&query,
|
appendPQExpBuffer(&query,
|
||||||
" UPDATE repmgr.nodes "
|
" UPDATE repmgr.nodes "
|
||||||
" SET active = FALSE "
|
" SET active = FALSE "
|
||||||
" WHERE type = 'master' "
|
" WHERE type = 'primary' "
|
||||||
" AND active IS TRUE ");
|
" AND active IS TRUE ");
|
||||||
|
|
||||||
res = PQexec(conn, query.data);
|
res = PQexec(conn, query.data);
|
||||||
|
|
||||||
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
{
|
{
|
||||||
log_error(_("unable to set old master node as inactive:\n %s"),
|
log_error(_("unable to set old primary node as inactive:\n %s"),
|
||||||
PQerrorMessage(conn));
|
PQerrorMessage(conn));
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
|
|
||||||
@@ -1544,7 +1544,7 @@ update_node_record_set_master(PGconn *conn, int this_node_id)
|
|||||||
|
|
||||||
appendPQExpBuffer(&query,
|
appendPQExpBuffer(&query,
|
||||||
" UPDATE repmgr.nodes"
|
" UPDATE repmgr.nodes"
|
||||||
" SET type = 'master', "
|
" SET type = 'primary', "
|
||||||
" upstream_node_id = NULL "
|
" upstream_node_id = NULL "
|
||||||
" WHERE node_id = %i ",
|
" WHERE node_id = %i ",
|
||||||
this_node_id);
|
this_node_id);
|
||||||
@@ -1554,7 +1554,7 @@ update_node_record_set_master(PGconn *conn, int this_node_id)
|
|||||||
|
|
||||||
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
if (PQresultStatus(res) != PGRES_COMMAND_OK)
|
||||||
{
|
{
|
||||||
log_error(_("unable to set current node %i as active master:\n %s"),
|
log_error(_("unable to set current node %i as active primary:\n %s"),
|
||||||
this_node_id,
|
this_node_id,
|
||||||
PQerrorMessage(conn));
|
PQerrorMessage(conn));
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
@@ -1658,7 +1658,7 @@ delete_node_record(PGconn *conn, int node)
|
|||||||
* Returns true if all operations succeeded, false if one or more failed.
|
* Returns true if all operations succeeded, false if one or more failed.
|
||||||
*
|
*
|
||||||
* Note this function may be called with `conn` set to NULL in cases where
|
* Note this function may be called with `conn` set to NULL in cases where
|
||||||
* the master node is not available and it's therefore not possible to write
|
* the primary node is not available and it's therefore not possible to write
|
||||||
* an event record. In this case, if `event_notification_command` is set, a
|
* an event record. In this case, if `event_notification_command` is set, a
|
||||||
* user-defined notification to be generated; if not, this function will have
|
* user-defined notification to be generated; if not, this function will have
|
||||||
* no effect.
|
* no effect.
|
||||||
@@ -2028,7 +2028,7 @@ drop_replication_slot(PGconn *conn, char *slot_name)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
RecordStatus
|
||||||
get_slot_record(PGconn *conn, char *slot_name, t_replication_slot *record)
|
get_slot_record(PGconn *conn, char *slot_name, t_replication_slot *record)
|
||||||
{
|
{
|
||||||
PQExpBufferData query;
|
PQExpBufferData query;
|
||||||
@@ -2053,12 +2053,12 @@ get_slot_record(PGconn *conn, char *slot_name, t_replication_slot *record)
|
|||||||
log_error(_("unable to query pg_replication_slots:\n %s"),
|
log_error(_("unable to query pg_replication_slots:\n %s"),
|
||||||
PQerrorMessage(conn));
|
PQerrorMessage(conn));
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
return -1;
|
return RECORD_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!PQntuples(res))
|
if (!PQntuples(res))
|
||||||
{
|
{
|
||||||
return 0;
|
return RECORD_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(record->slot_name, PQgetvalue(res, 0, 0), MAXLEN);
|
strncpy(record->slot_name, PQgetvalue(res, 0, 0), MAXLEN);
|
||||||
@@ -2069,7 +2069,7 @@ get_slot_record(PGconn *conn, char *slot_name, t_replication_slot *record)
|
|||||||
|
|
||||||
PQclear(res);
|
PQclear(res);
|
||||||
|
|
||||||
return 1;
|
return RECORD_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
16
dbutils.h
16
dbutils.h
@@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
UNKNOWN = 0,
|
UNKNOWN = 0,
|
||||||
MASTER,
|
PRIMARY,
|
||||||
STANDBY,
|
STANDBY,
|
||||||
WITNESS,
|
WITNESS,
|
||||||
BDR
|
BDR
|
||||||
@@ -32,7 +32,7 @@ typedef enum {
|
|||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
RECTYPE_UNKNOWN = 0,
|
RECTYPE_UNKNOWN = 0,
|
||||||
RECTYPE_MASTER,
|
RECTYPE_PRIMARY,
|
||||||
RECTYPE_STANDBY
|
RECTYPE_STANDBY
|
||||||
} RecoveryType;
|
} RecoveryType;
|
||||||
|
|
||||||
@@ -151,11 +151,11 @@ PGconn *establish_db_connection_as_user(const char *conninfo,
|
|||||||
PGconn *establish_db_connection_by_params(const char *keywords[],
|
PGconn *establish_db_connection_by_params(const char *keywords[],
|
||||||
const char *values[],
|
const char *values[],
|
||||||
const bool exit_on_error);
|
const bool exit_on_error);
|
||||||
PGconn *establish_master_db_connection(PGconn *conn,
|
PGconn *establish_primary_db_connection(PGconn *conn,
|
||||||
const bool exit_on_error);
|
const bool exit_on_error);
|
||||||
|
|
||||||
PGconn *get_master_connection(PGconn *standby_conn, int *master_id, char *master_conninfo_out);
|
PGconn *get_primary_connection(PGconn *standby_conn, int *primary_id, char *primary_conninfo_out);
|
||||||
PGconn *get_master_connection_quiet(PGconn *standby_conn, int *master_id, char *master_conninfo_out);
|
PGconn *get_primary_connection_quiet(PGconn *standby_conn, int *primary_id, char *primary_conninfo_out);
|
||||||
|
|
||||||
bool is_superuser_connection(PGconn *conn, t_connection_user *userinfo);
|
bool is_superuser_connection(PGconn *conn, t_connection_user *userinfo);
|
||||||
|
|
||||||
@@ -189,7 +189,7 @@ bool get_pg_setting(PGconn *conn, const char *setting, char *output);
|
|||||||
bool get_cluster_size(PGconn *conn, char *size);
|
bool get_cluster_size(PGconn *conn, char *size);
|
||||||
int get_server_version(PGconn *conn, char *server_version);
|
int get_server_version(PGconn *conn, char *server_version);
|
||||||
RecoveryType get_recovery_type(PGconn *conn);
|
RecoveryType get_recovery_type(PGconn *conn);
|
||||||
int get_master_node_id(PGconn *conn);
|
int get_primary_node_id(PGconn *conn);
|
||||||
|
|
||||||
/* extension functions */
|
/* extension functions */
|
||||||
ExtensionStatus get_repmgr_extension_status(PGconn *conn);
|
ExtensionStatus get_repmgr_extension_status(PGconn *conn);
|
||||||
@@ -204,14 +204,14 @@ const char * get_node_type_string(t_server_type type);
|
|||||||
RecordStatus get_node_record(PGconn *conn, int node_id, t_node_info *node_info);
|
RecordStatus get_node_record(PGconn *conn, int node_id, t_node_info *node_info);
|
||||||
RecordStatus get_node_record_by_name(PGconn *conn, const char *node_name, t_node_info *node_info);
|
RecordStatus get_node_record_by_name(PGconn *conn, const char *node_name, t_node_info *node_info);
|
||||||
bool get_local_node_record(PGconn *conn, int node_id, t_node_info *node_info);
|
bool get_local_node_record(PGconn *conn, int node_id, t_node_info *node_info);
|
||||||
bool get_master_node_record(PGconn *conn, t_node_info *node_info);
|
bool get_primary_node_record(PGconn *conn, t_node_info *node_info);
|
||||||
void get_downstream_node_records(PGconn *conn, int node_id, NodeInfoList *nodes);
|
void get_downstream_node_records(PGconn *conn, int node_id, NodeInfoList *nodes);
|
||||||
|
|
||||||
bool create_node_record(PGconn *conn, char *repmgr_action, t_node_info *node_info);
|
bool create_node_record(PGconn *conn, char *repmgr_action, t_node_info *node_info);
|
||||||
bool update_node_record(PGconn *conn, char *repmgr_action, t_node_info *node_info);
|
bool update_node_record(PGconn *conn, char *repmgr_action, t_node_info *node_info);
|
||||||
bool delete_node_record(PGconn *conn, int node);
|
bool delete_node_record(PGconn *conn, int node);
|
||||||
|
|
||||||
bool update_node_record_set_master(PGconn *conn, int this_node_id);
|
bool update_node_record_set_primary(PGconn *conn, int this_node_id);
|
||||||
bool update_node_record_status(PGconn *conn, int this_node_id, char *type, int upstream_node_id, bool active);
|
bool update_node_record_status(PGconn *conn, int this_node_id, char *type, int upstream_node_id, bool active);
|
||||||
|
|
||||||
/* event record functions */
|
/* event record functions */
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ CREATE TABLE nodes (
|
|||||||
upstream_node_id INTEGER NULL REFERENCES nodes (node_id) DEFERRABLE,
|
upstream_node_id INTEGER NULL REFERENCES nodes (node_id) DEFERRABLE,
|
||||||
active BOOLEAN NOT NULL DEFAULT TRUE,
|
active BOOLEAN NOT NULL DEFAULT TRUE,
|
||||||
node_name TEXT NOT NULL,
|
node_name TEXT NOT NULL,
|
||||||
type TEXT NOT NULL CHECK (type IN('master','standby','witness','bdr')),
|
type TEXT NOT NULL CHECK (type IN('primary','standby','witness','bdr')),
|
||||||
|
|
||||||
priority INT NOT NULL DEFAULT 100,
|
priority INT NOT NULL DEFAULT 100,
|
||||||
conninfo TEXT NOT NULL,
|
conninfo TEXT NOT NULL,
|
||||||
|
|||||||
@@ -1,12 +0,0 @@
|
|||||||
/*
|
|
||||||
* repmgr-action-master.h
|
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2017
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _REPMGR_ACTION_MASTER_H_
|
|
||||||
#define _REPMGR_ACTION_MASTER_H_
|
|
||||||
|
|
||||||
extern void do_master_register(void);
|
|
||||||
extern void do_master_unregister(void);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* repmgr-action-cluster.c
|
* repmgr-action-primary.c
|
||||||
*
|
*
|
||||||
* Implements master actions for the repmgr command line utility
|
* Implements primary actions for the repmgr command line utility
|
||||||
*
|
*
|
||||||
* Copyright (c) 2ndQuadrant, 2010-2017
|
* Copyright (c) 2ndQuadrant, 2010-2017
|
||||||
*/
|
*/
|
||||||
@@ -9,21 +9,21 @@
|
|||||||
#include "repmgr.h"
|
#include "repmgr.h"
|
||||||
|
|
||||||
#include "repmgr-client-global.h"
|
#include "repmgr-client-global.h"
|
||||||
#include "repmgr-action-master.h"
|
#include "repmgr-action-primary.h"
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do_master_register()
|
* do_primary_register()
|
||||||
*
|
*
|
||||||
* Event(s):
|
* Event(s):
|
||||||
* - master_register
|
* - primary_register
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
do_master_register(void)
|
do_primary_register(void)
|
||||||
{
|
{
|
||||||
PGconn *conn = NULL;
|
PGconn *conn = NULL;
|
||||||
PGconn *master_conn = NULL;
|
PGconn *primary_conn = NULL;
|
||||||
int current_master_id = UNKNOWN_NODE_ID;
|
int current_primary_id = UNKNOWN_NODE_ID;
|
||||||
RecoveryType recovery_type;
|
RecoveryType recovery_type;
|
||||||
t_node_info node_info = T_NODE_INFO_INITIALIZER;
|
t_node_info node_info = T_NODE_INFO_INITIALIZER;
|
||||||
RecordStatus record_status;
|
RecordStatus record_status;
|
||||||
@@ -32,22 +32,22 @@ do_master_register(void)
|
|||||||
|
|
||||||
PQExpBufferData event_description;
|
PQExpBufferData event_description;
|
||||||
|
|
||||||
log_info(_("connecting to master database..."));
|
log_info(_("connecting to primary database..."));
|
||||||
|
|
||||||
conn = establish_db_connection(config_file_options.conninfo, true);
|
conn = establish_db_connection(config_file_options.conninfo, true);
|
||||||
log_verbose(LOG_INFO, _("connected to server, checking its state"));
|
log_verbose(LOG_INFO, _("connected to server, checking its state"));
|
||||||
|
|
||||||
/* verify that node is running a supported server version */
|
/* verify that node is running a supported server version */
|
||||||
check_server_version(conn, "master", true, NULL);
|
check_server_version(conn, "primary", true, NULL);
|
||||||
|
|
||||||
/* check that node is actually a master */
|
/* check that node is actually a primary */
|
||||||
recovery_type = get_recovery_type(conn);
|
recovery_type = get_recovery_type(conn);
|
||||||
|
|
||||||
if (recovery_type != RECTYPE_MASTER)
|
if (recovery_type != RECTYPE_PRIMARY)
|
||||||
{
|
{
|
||||||
if (recovery_type == RECTYPE_STANDBY)
|
if (recovery_type == RECTYPE_STANDBY)
|
||||||
{
|
{
|
||||||
log_error(_("server is in standby mode and cannot be registered as a master"));
|
log_error(_("server is in standby mode and cannot be registered as a primary"));
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
@@ -80,36 +80,36 @@ do_master_register(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Ensure there isn't another registered node which is master */
|
/* Ensure there isn't another registered node which is primary */
|
||||||
master_conn = get_master_connection(conn, ¤t_master_id, NULL);
|
primary_conn = get_primary_connection(conn, ¤t_primary_id, NULL);
|
||||||
|
|
||||||
if (master_conn != NULL)
|
if (primary_conn != NULL)
|
||||||
{
|
{
|
||||||
if (current_master_id != config_file_options.node_id)
|
if (current_primary_id != config_file_options.node_id)
|
||||||
{
|
{
|
||||||
/* it's impossible to add a second master to a streaming replication cluster */
|
/* it's impossible to add a second primary to a streaming replication cluster */
|
||||||
log_error(_("there is already an active registered master (node ID: %i) in this cluster"), current_master_id);
|
log_error(_("there is already an active registered primary (node ID: %i) in this cluster"), current_primary_id);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we've probably connected to ourselves */
|
/* we've probably connected to ourselves */
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
begin_transaction(conn);
|
begin_transaction(conn);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check for an active master node record with a different ID. This shouldn't
|
* Check for an active primary node record with a different ID. This shouldn't
|
||||||
* happen, but could do if an existing master was shut down without being unregistered.
|
* happen, but could do if an existing primary was shut down without being unregistered.
|
||||||
*/
|
*/
|
||||||
current_master_id = get_master_node_id(conn);
|
current_primary_id = get_primary_node_id(conn);
|
||||||
if (current_master_id != NODE_NOT_FOUND && current_master_id != config_file_options.node_id)
|
if (current_primary_id != NODE_NOT_FOUND && current_primary_id != config_file_options.node_id)
|
||||||
{
|
{
|
||||||
log_error(_("another node with id %i is already registered as master"), current_master_id);
|
log_error(_("another node with id %i is already registered as primary"), current_primary_id);
|
||||||
log_detail(_("a streaming replication cluster can have only one master node"));
|
log_detail(_("a streaming replication cluster can have only one primary node"));
|
||||||
|
|
||||||
rollback_transaction(conn);
|
rollback_transaction(conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
@@ -142,14 +142,14 @@ do_master_register(void)
|
|||||||
/* if upstream_node_id set, warn that it will be ignored */
|
/* if upstream_node_id set, warn that it will be ignored */
|
||||||
if (config_file_options.upstream_node_id != NO_UPSTREAM_NODE)
|
if (config_file_options.upstream_node_id != NO_UPSTREAM_NODE)
|
||||||
{
|
{
|
||||||
log_warning(_("master node %i is configured with \"upstream_node_id\" set to %i"),
|
log_warning(_("primary node %i is configured with \"upstream_node_id\" set to %i"),
|
||||||
node_info.node_id,
|
node_info.node_id,
|
||||||
config_file_options.upstream_node_id);
|
config_file_options.upstream_node_id);
|
||||||
log_detail(_("the value set for \"upstream_node_id\" will be ignored"));
|
log_detail(_("the value set for \"upstream_node_id\" will be ignored"));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set type to "master", active to "true" and unset upstream_node_id*/
|
/* set type to "primary", active to "true" and unset upstream_node_id*/
|
||||||
node_info.type = MASTER;
|
node_info.type = PRIMARY;
|
||||||
node_info.upstream_node_id = NO_UPSTREAM_NODE;
|
node_info.upstream_node_id = NO_UPSTREAM_NODE;
|
||||||
node_info.active = true;
|
node_info.active = true;
|
||||||
|
|
||||||
@@ -176,17 +176,17 @@ do_master_register(void)
|
|||||||
if (record_status == RECORD_FOUND)
|
if (record_status == RECORD_FOUND)
|
||||||
{
|
{
|
||||||
record_created = update_node_record(conn,
|
record_created = update_node_record(conn,
|
||||||
"master register",
|
"primary register",
|
||||||
&node_info);
|
&node_info);
|
||||||
if (record_created == true)
|
if (record_created == true)
|
||||||
{
|
{
|
||||||
appendPQExpBuffer(&event_description,
|
appendPQExpBuffer(&event_description,
|
||||||
"existing master record updated");
|
"existing primary record updated");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
appendPQExpBuffer(&event_description,
|
appendPQExpBuffer(&event_description,
|
||||||
"error encountered while updating master record:\n%s",
|
"error encountered while updating primary record:\n%s",
|
||||||
PQerrorMessage(conn));
|
PQerrorMessage(conn));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -194,12 +194,12 @@ do_master_register(void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
record_created = create_node_record(conn,
|
record_created = create_node_record(conn,
|
||||||
"master register",
|
"primary register",
|
||||||
&node_info);
|
&node_info);
|
||||||
if (record_created == false)
|
if (record_created == false)
|
||||||
{
|
{
|
||||||
appendPQExpBuffer(&event_description,
|
appendPQExpBuffer(&event_description,
|
||||||
"error encountered while creating master record:\n%s",
|
"error encountered while creating primary record:\n%s",
|
||||||
PQerrorMessage(conn));
|
PQerrorMessage(conn));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,7 +218,7 @@ do_master_register(void)
|
|||||||
create_event_record(conn,
|
create_event_record(conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"master_register",
|
"primary_register",
|
||||||
record_created,
|
record_created,
|
||||||
event_description.data);
|
event_description.data);
|
||||||
|
|
||||||
@@ -227,18 +227,18 @@ do_master_register(void)
|
|||||||
|
|
||||||
if (record_created == false)
|
if (record_created == false)
|
||||||
{
|
{
|
||||||
log_notice(_("unable to register master node - see preceding messages"));
|
log_notice(_("unable to register primary node - see preceding messages"));
|
||||||
exit(ERR_DB_QUERY);
|
exit(ERR_DB_QUERY);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (record_status == RECORD_FOUND)
|
if (record_status == RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_notice(_("master node record (id: %i) updated"),
|
log_notice(_("primary node record (id: %i) updated"),
|
||||||
config_file_options.node_id);
|
config_file_options.node_id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
log_notice(_("master node record (id: %i) registered"),
|
log_notice(_("primary node record (id: %i) registered"),
|
||||||
config_file_options.node_id);
|
config_file_options.node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -247,16 +247,16 @@ do_master_register(void)
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do_master_unregister()
|
* do_primary_unregister()
|
||||||
*
|
*
|
||||||
* Event(s):
|
* Event(s):
|
||||||
* - master_unregister
|
* - primary_unregister
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void
|
void
|
||||||
do_master_unregister(void)
|
do_primary_unregister(void)
|
||||||
{
|
{
|
||||||
PGconn *master_conn = NULL;
|
PGconn *primary_conn = NULL;
|
||||||
PGconn *local_conn = NULL;
|
PGconn *local_conn = NULL;
|
||||||
t_node_info local_node_info = T_NODE_INFO_INITIALIZER;
|
t_node_info local_node_info = T_NODE_INFO_INITIALIZER;
|
||||||
|
|
||||||
@@ -272,26 +272,26 @@ do_master_unregister(void)
|
|||||||
get_local_node_record(local_conn, config_file_options.node_id, &local_node_info);
|
get_local_node_record(local_conn, config_file_options.node_id, &local_node_info);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Obtain a connection to the current master node - if this isn't possible,
|
* Obtain a connection to the current primary node - if this isn't possible,
|
||||||
* abort as we won't be able to update the "nodes" table anyway.
|
* abort as we won't be able to update the "nodes" table anyway.
|
||||||
*/
|
*/
|
||||||
master_conn = establish_master_db_connection(local_conn, false);
|
primary_conn = establish_primary_db_connection(local_conn, false);
|
||||||
|
|
||||||
if (PQstatus(master_conn) != CONNECTION_OK)
|
if (PQstatus(primary_conn) != CONNECTION_OK)
|
||||||
{
|
{
|
||||||
t_node_info master_node_info;
|
t_node_info primary_node_info;
|
||||||
|
|
||||||
log_error(_("unable to connect to master server"));
|
log_error(_("unable to connect to primary server"));
|
||||||
|
|
||||||
if (get_master_node_record(local_conn, &master_node_info))
|
if (get_primary_node_record(local_conn, &primary_node_info))
|
||||||
{
|
{
|
||||||
log_detail(_("current master registered as node %s (id: %i, conninfo: \"%s\")"),
|
log_detail(_("current primary registered as node %s (id: %i, conninfo: \"%s\")"),
|
||||||
master_node_info.node_name,
|
primary_node_info.node_name,
|
||||||
master_node_info.node_id,
|
primary_node_info.node_id,
|
||||||
master_node_info.conninfo);
|
primary_node_info.conninfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_hint(_("you may need to promote this standby or ask it to look for a new master to follow"));
|
log_hint(_("you may need to promote this standby or ask it to look for a new primary to follow"));
|
||||||
PQfinish(local_conn);
|
PQfinish(local_conn);
|
||||||
exit(ERR_DB_CONN);
|
exit(ERR_DB_CONN);
|
||||||
}
|
}
|
||||||
@@ -316,7 +316,7 @@ do_master_unregister(void)
|
|||||||
* Check for downstream nodes - if any still defined, we won't be able to
|
* Check for downstream nodes - if any still defined, we won't be able to
|
||||||
* delete the node record due to foreign key constraints.
|
* delete the node record due to foreign key constraints.
|
||||||
*/
|
*/
|
||||||
get_downstream_node_records(master_conn, target_node_info_ptr->node_id, &downstream_nodes);
|
get_downstream_node_records(primary_conn, target_node_info_ptr->node_id, &downstream_nodes);
|
||||||
|
|
||||||
if (downstream_nodes.node_count > 0)
|
if (downstream_nodes.node_count > 0)
|
||||||
{
|
{
|
||||||
@@ -334,7 +334,7 @@ do_master_unregister(void)
|
|||||||
downstream_nodes.node_count);
|
downstream_nodes.node_count);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_hint(_("ensure these nodes are following the current master with \"repmgr standby follow\""));
|
log_hint(_("ensure these nodes are following the current primary with \"repmgr standby follow\""));
|
||||||
|
|
||||||
initPQExpBuffer(&detail);
|
initPQExpBuffer(&detail);
|
||||||
|
|
||||||
@@ -349,19 +349,19 @@ do_master_unregister(void)
|
|||||||
log_detail(_("the affected node(s) are:\n%s"), detail.data);
|
log_detail(_("the affected node(s) are:\n%s"), detail.data);
|
||||||
|
|
||||||
termPQExpBuffer(&detail);
|
termPQExpBuffer(&detail);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
|
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
target_node_conn = establish_db_connection_quiet(target_node_info_ptr->conninfo);
|
target_node_conn = establish_db_connection_quiet(target_node_info_ptr->conninfo);
|
||||||
|
|
||||||
/* If node not reachable, check that the record is for a master node */
|
/* If node not reachable, check that the record is for a primary node */
|
||||||
if (PQstatus(target_node_conn) != CONNECTION_OK)
|
if (PQstatus(target_node_conn) != CONNECTION_OK)
|
||||||
{
|
{
|
||||||
if (target_node_info_ptr->type != MASTER)
|
if (target_node_info_ptr->type != PRIMARY)
|
||||||
{
|
{
|
||||||
log_error(_("node %s (id: %i) is not a master, unable to unregister"),
|
log_error(_("node %s (id: %i) is not a primary, unable to unregister"),
|
||||||
target_node_info_ptr->node_name,
|
target_node_info_ptr->node_name,
|
||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
if (target_node_info_ptr->type == STANDBY)
|
if (target_node_info_ptr->type == STANDBY)
|
||||||
@@ -369,7 +369,7 @@ do_master_unregister(void)
|
|||||||
log_hint(_("the node can be unregistered with \"repmgr standby unregister\""));
|
log_hint(_("the node can be unregistered with \"repmgr standby unregister\""));
|
||||||
}
|
}
|
||||||
|
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -382,9 +382,9 @@ do_master_unregister(void)
|
|||||||
/* Node appears to be a standby */
|
/* Node appears to be a standby */
|
||||||
if (recovery_type == RECTYPE_STANDBY)
|
if (recovery_type == RECTYPE_STANDBY)
|
||||||
{
|
{
|
||||||
/* We'll refuse to do anything unless the node record shows it as a master */
|
/* We'll refuse to do anything unless the node record shows it as a primary */
|
||||||
|
|
||||||
if (target_node_info_ptr->type != MASTER)
|
if (target_node_info_ptr->type != PRIMARY)
|
||||||
{
|
{
|
||||||
log_error(_("node %s (id: %i) is a %s, unable to unregister"),
|
log_error(_("node %s (id: %i) is a %s, unable to unregister"),
|
||||||
target_node_info_ptr->node_name,
|
target_node_info_ptr->node_name,
|
||||||
@@ -394,7 +394,7 @@ do_master_unregister(void)
|
|||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* If --F/--force not set, hint that it might be appropriate to
|
* If --F/--force not set, hint that it might be appropriate to
|
||||||
* register the node as a standby rather than unregister as master
|
* register the node as a standby rather than unregister as primary
|
||||||
*/
|
*/
|
||||||
else if (!runtime_options.force)
|
else if (!runtime_options.force)
|
||||||
{
|
{
|
||||||
@@ -402,7 +402,7 @@ do_master_unregister(void)
|
|||||||
target_node_info_ptr->node_name,
|
target_node_info_ptr->node_name,
|
||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
log_hint(_("the node can be registered as a standby with \"repmgr standby register --force\""));
|
log_hint(_("the node can be registered as a standby with \"repmgr standby register --force\""));
|
||||||
log_hint(_("use \"repmgr master unregister --force\" to remove this node's metadata entirely"));
|
log_hint(_("use \"repmgr primary unregister --force\" to remove this node's metadata entirely"));
|
||||||
can_unregister = false;
|
can_unregister = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -410,42 +410,42 @@ do_master_unregister(void)
|
|||||||
if (can_unregister == false)
|
if (can_unregister == false)
|
||||||
{
|
{
|
||||||
PQfinish(target_node_conn);
|
PQfinish(target_node_conn);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (recovery_type == RECTYPE_MASTER)
|
else if (recovery_type == RECTYPE_PRIMARY)
|
||||||
{
|
{
|
||||||
t_node_info master_node_info = T_NODE_INFO_INITIALIZER;
|
t_node_info primary_node_info = T_NODE_INFO_INITIALIZER;
|
||||||
bool master_record_found;
|
bool primary_record_found;
|
||||||
|
|
||||||
master_record_found = get_master_node_record(master_conn, &master_node_info);
|
primary_record_found = get_primary_node_record(primary_conn, &primary_node_info);
|
||||||
|
|
||||||
if (master_record_found == false)
|
if (primary_record_found == false)
|
||||||
{
|
{
|
||||||
log_error(_("node %s (id: %i) is a master node, but no master node record found"),
|
log_error(_("node %s (id: %i) is a primary node, but no primary node record found"),
|
||||||
target_node_info_ptr->node_name,
|
target_node_info_ptr->node_name,
|
||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
log_hint(_("register this node as master with \"repmgr master register --force\""));
|
log_hint(_("register this node as primary with \"repmgr primary register --force\""));
|
||||||
PQfinish(target_node_conn);
|
PQfinish(target_node_conn);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
/* This appears to be the cluster master - cowardly refuse
|
/* This appears to be the cluster primary - cowardly refuse
|
||||||
* to delete the record
|
* to delete the record
|
||||||
*/
|
*/
|
||||||
if (master_node_info.node_id == target_node_info_ptr->node_id)
|
if (primary_node_info.node_id == target_node_info_ptr->node_id)
|
||||||
{
|
{
|
||||||
log_error(_("node %s (id: %i) is the current master node, unable to unregister"),
|
log_error(_("node %s (id: %i) is the current primary node, unable to unregister"),
|
||||||
target_node_info_ptr->node_name,
|
target_node_info_ptr->node_name,
|
||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
|
|
||||||
if (master_node_info.active == false)
|
if (primary_node_info.active == false)
|
||||||
{
|
{
|
||||||
log_hint(_("node is marked as inactive, activate with \"repmgr master register --force\""));
|
log_hint(_("node is marked as inactive, activate with \"repmgr primary register --force\""));
|
||||||
}
|
}
|
||||||
PQfinish(target_node_conn);
|
PQfinish(target_node_conn);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -461,8 +461,8 @@ do_master_unregister(void)
|
|||||||
log_error(_("node %s (id: %i) is marked as active, unable to unregister"),
|
log_error(_("node %s (id: %i) is marked as active, unable to unregister"),
|
||||||
target_node_info_ptr->node_name,
|
target_node_info_ptr->node_name,
|
||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
log_hint(_("run \"repmgr master unregister --force\" to unregister this node"));
|
log_hint(_("run \"repmgr primary unregister --force\" to unregister this node"));
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -477,7 +477,7 @@ do_master_unregister(void)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
PQExpBufferData event_details;
|
PQExpBufferData event_details;
|
||||||
bool delete_success = delete_node_record(master_conn,
|
bool delete_success = delete_node_record(primary_conn,
|
||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
|
|
||||||
if (delete_success == false)
|
if (delete_success == false)
|
||||||
@@ -485,7 +485,7 @@ do_master_unregister(void)
|
|||||||
log_error(_("unable to unregister node %s (id: %i)"),
|
log_error(_("unable to unregister node %s (id: %i)"),
|
||||||
target_node_info_ptr->node_name,
|
target_node_info_ptr->node_name,
|
||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_DB_QUERY);
|
exit(ERR_DB_QUERY);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -503,10 +503,10 @@ do_master_unregister(void)
|
|||||||
config_file_options.node_id);
|
config_file_options.node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"master_unregister",
|
"primary_unregister",
|
||||||
true,
|
true,
|
||||||
event_details.data);
|
event_details.data);
|
||||||
termPQExpBuffer(&event_details);
|
termPQExpBuffer(&event_details);
|
||||||
@@ -516,6 +516,6 @@ do_master_unregister(void)
|
|||||||
target_node_info_ptr->node_id);
|
target_node_info_ptr->node_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
12
repmgr-action-primary.h
Normal file
12
repmgr-action-primary.h
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
/*
|
||||||
|
* repmgr-action-primary.h
|
||||||
|
* Copyright (c) 2ndQuadrant, 2010-2017
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _REPMGR_ACTION_PRIMARY_H_
|
||||||
|
#define _REPMGR_ACTION_PRIMARY_H_
|
||||||
|
|
||||||
|
extern void do_primary_register(void);
|
||||||
|
extern void do_primary_unregister(void);
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -34,7 +34,7 @@ typedef struct TablespaceDataList
|
|||||||
} TablespaceDataList;
|
} TablespaceDataList;
|
||||||
|
|
||||||
|
|
||||||
static PGconn *master_conn = NULL;
|
static PGconn *primary_conn = NULL;
|
||||||
static PGconn *source_conn = NULL;
|
static PGconn *source_conn = NULL;
|
||||||
|
|
||||||
static int server_version_num = UNKNOWN_SERVER_VERSION_NUM;
|
static int server_version_num = UNKNOWN_SERVER_VERSION_NUM;
|
||||||
@@ -62,7 +62,7 @@ static char barman_command_buf[MAXLEN] = "";
|
|||||||
static void check_barman_config(void);
|
static void check_barman_config(void);
|
||||||
static void check_source_server(void);
|
static void check_source_server(void);
|
||||||
static void check_source_server_via_barman(void);
|
static void check_source_server_via_barman(void);
|
||||||
static void check_master_standby_version_match(PGconn *conn, PGconn *master_conn);
|
static void check_primary_standby_version_match(PGconn *conn, PGconn *primary_conn);
|
||||||
static void check_recovery_type(PGconn *conn);
|
static void check_recovery_type(PGconn *conn);
|
||||||
|
|
||||||
static void initialise_direct_clone(void);
|
static void initialise_direct_clone(void);
|
||||||
@@ -328,7 +328,7 @@ do_standby_clone(void)
|
|||||||
drop_replication_slot(source_conn, repmgr_slot_name);
|
drop_replication_slot(source_conn, repmgr_slot_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_error(_("unable to take a base backup of the master server"));
|
log_error(_("unable to take a base backup of the primary server"));
|
||||||
log_warning(_("data directory (%s) may need to be cleaned up manually"),
|
log_warning(_("data directory (%s) may need to be cleaned up manually"),
|
||||||
local_data_directory);
|
local_data_directory);
|
||||||
|
|
||||||
@@ -407,12 +407,13 @@ do_standby_clone(void)
|
|||||||
*/
|
*/
|
||||||
{
|
{
|
||||||
t_node_info node_record = T_NODE_INFO_INITIALIZER;
|
t_node_info node_record = T_NODE_INFO_INITIALIZER;
|
||||||
int node_result;
|
RecordStatus record_status;
|
||||||
|
|
||||||
node_result = get_node_record(master_conn,
|
record_status = get_node_record(primary_conn,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
&node_record);
|
&node_record);
|
||||||
if (node_result)
|
|
||||||
|
if (record_status == RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_hint(_("after starting the server, you need to re-register this standby with \"repmgr standby register --force\" to overwrite the existing node record"));
|
log_hint(_("after starting the server, you need to re-register this standby with \"repmgr standby register --force\" to overwrite the existing node record"));
|
||||||
}
|
}
|
||||||
@@ -451,15 +452,15 @@ do_standby_clone(void)
|
|||||||
_("; --force: %s"),
|
_("; --force: %s"),
|
||||||
runtime_options.force ? "Y" : "N");
|
runtime_options.force ? "Y" : "N");
|
||||||
|
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"standby_clone",
|
"standby_clone",
|
||||||
true,
|
true,
|
||||||
event_details.data);
|
event_details.data);
|
||||||
|
|
||||||
if (PQstatus(master_conn) == CONNECTION_OK)
|
if (PQstatus(primary_conn) == CONNECTION_OK)
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
|
|
||||||
if (PQstatus(source_conn) == CONNECTION_OK)
|
if (PQstatus(source_conn) == CONNECTION_OK)
|
||||||
PQfinish(source_conn);
|
PQfinish(source_conn);
|
||||||
@@ -556,11 +557,11 @@ void
|
|||||||
do_standby_register(void)
|
do_standby_register(void)
|
||||||
{
|
{
|
||||||
PGconn *conn;
|
PGconn *conn;
|
||||||
PGconn *master_conn;
|
PGconn *primary_conn;
|
||||||
|
|
||||||
bool record_created;
|
bool record_created;
|
||||||
t_node_info node_record = T_NODE_INFO_INITIALIZER;
|
t_node_info node_record = T_NODE_INFO_INITIALIZER;
|
||||||
int node_result;
|
RecordStatus record_status;
|
||||||
|
|
||||||
log_info(_("connecting to standby database"));
|
log_info(_("connecting to standby database"));
|
||||||
conn = establish_db_connection_quiet(config_file_options.conninfo);
|
conn = establish_db_connection_quiet(config_file_options.conninfo);
|
||||||
@@ -574,14 +575,14 @@ do_standby_register(void)
|
|||||||
config_file_options.node_name);
|
config_file_options.node_name);
|
||||||
log_detail(_("%s"),
|
log_detail(_("%s"),
|
||||||
PQerrorMessage(conn));
|
PQerrorMessage(conn));
|
||||||
log_hint(_("to register a standby which is not running, provide master connection parameters and use option -F/--force"));
|
log_hint(_("to register a standby which is not running, provide primary connection parameters and use option -F/--force"));
|
||||||
|
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!runtime_options.connection_param_provided)
|
if (!runtime_options.connection_param_provided)
|
||||||
{
|
{
|
||||||
log_error(_("unable to connect to local node %i (\"%s\") and no master connection parameters provided"),
|
log_error(_("unable to connect to local node %i (\"%s\") and no primary connection parameters provided"),
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
config_file_options.node_name);
|
config_file_options.node_name);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
@@ -594,18 +595,18 @@ do_standby_register(void)
|
|||||||
check_recovery_type(conn);
|
check_recovery_type(conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* check if there is a master in this cluster */
|
/* check if there is a primary in this cluster */
|
||||||
log_info(_("connecting to master database"));
|
log_info(_("connecting to primary database"));
|
||||||
|
|
||||||
/* Normal case - we can connect to the local node */
|
/* Normal case - we can connect to the local node */
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
{
|
{
|
||||||
master_conn = get_master_connection(conn, NULL, NULL);
|
primary_conn = get_primary_connection(conn, NULL, NULL);
|
||||||
}
|
}
|
||||||
/* User is forcing a registration and must have supplied master connection info */
|
/* User is forcing a registration and must have supplied primary connection info */
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
master_conn = establish_db_connection_by_params((const char**)source_conninfo.keywords,
|
primary_conn = establish_db_connection_by_params((const char**)source_conninfo.keywords,
|
||||||
(const char**)source_conninfo.values,
|
(const char**)source_conninfo.values,
|
||||||
false);
|
false);
|
||||||
}
|
}
|
||||||
@@ -613,17 +614,17 @@ do_standby_register(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* no amount of --force will make it possible to register the standby
|
* no amount of --force will make it possible to register the standby
|
||||||
* without a master server to connect to
|
* without a primary server to connect to
|
||||||
*/
|
*/
|
||||||
if (PQstatus(master_conn) != CONNECTION_OK)
|
if (PQstatus(primary_conn) != CONNECTION_OK)
|
||||||
{
|
{
|
||||||
log_error(_("unable to connect to the master database"));
|
log_error(_("unable to connect to the primary database"));
|
||||||
log_hint(_("a master must be configured before registering a standby"));
|
log_hint(_("a primary must be configured before registering a standby"));
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Verify that standby and master are supported and compatible server
|
* Verify that standby and primary are supported and compatible server
|
||||||
* versions
|
* versions
|
||||||
*
|
*
|
||||||
* If the user is registering an inactive standby, we'll trust they know
|
* If the user is registering an inactive standby, we'll trust they know
|
||||||
@@ -631,7 +632,7 @@ do_standby_register(void)
|
|||||||
*/
|
*/
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
{
|
{
|
||||||
check_master_standby_version_match(conn, master_conn);
|
check_primary_standby_version_match(conn, primary_conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -639,18 +640,18 @@ do_standby_register(void)
|
|||||||
* Check that an active node with the same node_name doesn't exist already
|
* Check that an active node with the same node_name doesn't exist already
|
||||||
*/
|
*/
|
||||||
|
|
||||||
node_result = get_node_record_by_name(master_conn,
|
record_status = get_node_record_by_name(primary_conn,
|
||||||
config_file_options.node_name,
|
config_file_options.node_name,
|
||||||
&node_record);
|
&node_record);
|
||||||
|
|
||||||
if (node_result)
|
if (record_status == RECORD_FOUND)
|
||||||
{
|
{
|
||||||
if (node_record.active == true && node_record.node_id != config_file_options.node_id)
|
if (node_record.active == true && node_record.node_id != config_file_options.node_id)
|
||||||
{
|
{
|
||||||
log_error(_("node %i exists already with node_name \"%s\""),
|
log_error(_("node %i exists already with node_name \"%s\""),
|
||||||
node_record.node_id,
|
node_record.node_id,
|
||||||
config_file_options.node_name);
|
config_file_options.node_name);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
@@ -659,16 +660,16 @@ do_standby_register(void)
|
|||||||
|
|
||||||
/* Check if node record exists */
|
/* Check if node record exists */
|
||||||
|
|
||||||
node_result = get_node_record(master_conn,
|
record_status= get_node_record(primary_conn,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
&node_record);
|
&node_record);
|
||||||
|
|
||||||
if (node_result && !runtime_options.force)
|
if (record_status == RECORD_FOUND && !runtime_options.force)
|
||||||
{
|
{
|
||||||
log_error(_("node %i is already registered"),
|
log_error(_("node %i is already registered"),
|
||||||
config_file_options.node_id);
|
config_file_options.node_id);
|
||||||
log_hint(_("use option -F/--force to overwrite an existing node record"));
|
log_hint(_("use option -F/--force to overwrite an existing node record"));
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
@@ -681,13 +682,13 @@ do_standby_register(void)
|
|||||||
|
|
||||||
if (config_file_options.upstream_node_id != NO_UPSTREAM_NODE)
|
if (config_file_options.upstream_node_id != NO_UPSTREAM_NODE)
|
||||||
{
|
{
|
||||||
int upstream_node_result;
|
RecordStatus upstream_record_status;
|
||||||
|
|
||||||
upstream_node_result = get_node_record(master_conn,
|
upstream_record_status = get_node_record(primary_conn,
|
||||||
config_file_options.upstream_node_id,
|
config_file_options.upstream_node_id,
|
||||||
&node_record);
|
&node_record);
|
||||||
|
|
||||||
if (!upstream_node_result)
|
if (upstream_record_status != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
t_node_info upstream_node_record = T_NODE_INFO_INITIALIZER;
|
t_node_info upstream_node_record = T_NODE_INFO_INITIALIZER;
|
||||||
|
|
||||||
@@ -697,7 +698,7 @@ do_standby_register(void)
|
|||||||
config_file_options.upstream_node_id);
|
config_file_options.upstream_node_id);
|
||||||
/* footgun alert - only do this if you know what you're doing */
|
/* footgun alert - only do this if you know what you're doing */
|
||||||
log_hint(_("use option -F/--force to create a dummy upstream record"));
|
log_hint(_("use option -F/--force to create a dummy upstream record"));
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
@@ -712,7 +713,7 @@ do_standby_register(void)
|
|||||||
strncpy(upstream_node_record.conninfo, runtime_options.upstream_conninfo, MAXLEN);
|
strncpy(upstream_node_record.conninfo, runtime_options.upstream_conninfo, MAXLEN);
|
||||||
upstream_node_record.active = false;
|
upstream_node_record.active = false;
|
||||||
|
|
||||||
record_created = create_node_record(master_conn,
|
record_created = create_node_record(primary_conn,
|
||||||
"standby register",
|
"standby register",
|
||||||
&upstream_node_record);
|
&upstream_node_record);
|
||||||
|
|
||||||
@@ -728,14 +729,14 @@ do_standby_register(void)
|
|||||||
*/
|
*/
|
||||||
if (record_created == false)
|
if (record_created == false)
|
||||||
{
|
{
|
||||||
upstream_node_result = get_node_record(master_conn,
|
upstream_record_status = get_node_record(primary_conn,
|
||||||
config_file_options.upstream_node_id,
|
config_file_options.upstream_node_id,
|
||||||
&node_record);
|
&node_record);
|
||||||
if (!upstream_node_result)
|
if (upstream_record_status != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_error(_("unable to create placeholder record for upstream node %i"),
|
log_error(_("unable to create placeholder record for upstream node %i"),
|
||||||
config_file_options.upstream_node_id);
|
config_file_options.upstream_node_id);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
@@ -756,7 +757,7 @@ do_standby_register(void)
|
|||||||
log_error(_("record for upstream node %i is marked as inactive"),
|
log_error(_("record for upstream node %i is marked as inactive"),
|
||||||
config_file_options.upstream_node_id);
|
config_file_options.upstream_node_id);
|
||||||
log_hint(_("use option -F/--force to register a standby with an inactive upstream node"));
|
log_hint(_("use option -F/--force to register a standby with an inactive upstream node"));
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
@@ -801,15 +802,15 @@ do_standby_register(void)
|
|||||||
* node record exists - update it
|
* node record exists - update it
|
||||||
* (at this point we have already established that -F/--force is in use)
|
* (at this point we have already established that -F/--force is in use)
|
||||||
*/
|
*/
|
||||||
if (node_result)
|
if (record_status == RECORD_FOUND)
|
||||||
{
|
{
|
||||||
record_created = update_node_record(master_conn,
|
record_created = update_node_record(primary_conn,
|
||||||
"standby register",
|
"standby register",
|
||||||
&node_record);
|
&node_record);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
record_created = create_node_record(master_conn,
|
record_created = create_node_record(primary_conn,
|
||||||
"standby register",
|
"standby register",
|
||||||
&node_record);
|
&node_record);
|
||||||
}
|
}
|
||||||
@@ -818,14 +819,14 @@ do_standby_register(void)
|
|||||||
{
|
{
|
||||||
/* XXX add event description */
|
/* XXX add event description */
|
||||||
|
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"standby_register",
|
"standby_register",
|
||||||
false,
|
false,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
|
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
@@ -833,7 +834,7 @@ do_standby_register(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Log the event */
|
/* Log the event */
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"standby_register",
|
"standby_register",
|
||||||
@@ -848,18 +849,18 @@ do_standby_register(void)
|
|||||||
{
|
{
|
||||||
bool sync_ok = false;
|
bool sync_ok = false;
|
||||||
int timer = 0;
|
int timer = 0;
|
||||||
int node_record_result;
|
RecordStatus node_record_status;
|
||||||
t_node_info node_record_on_master = T_NODE_INFO_INITIALIZER;
|
t_node_info node_record_on_primary = T_NODE_INFO_INITIALIZER;
|
||||||
t_node_info node_record_on_standby = T_NODE_INFO_INITIALIZER;
|
t_node_info node_record_on_standby = T_NODE_INFO_INITIALIZER;
|
||||||
|
|
||||||
node_record_result = get_node_record(master_conn,
|
node_record_status = get_node_record(primary_conn,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
&node_record_on_master);
|
&node_record_on_primary);
|
||||||
|
|
||||||
if (node_record_result != 1)
|
if (node_record_status != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_error(_("unable to retrieve node record from master"));
|
log_error(_("unable to retrieve node record from primary"));
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_REGISTRATION_SYNC);
|
exit(ERR_REGISTRATION_SYNC);
|
||||||
}
|
}
|
||||||
@@ -871,37 +872,37 @@ do_standby_register(void)
|
|||||||
if (runtime_options.wait_register_sync_seconds && runtime_options.wait_register_sync_seconds == timer)
|
if (runtime_options.wait_register_sync_seconds && runtime_options.wait_register_sync_seconds == timer)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
node_record_result = get_node_record(conn,
|
node_record_status = get_node_record(conn,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
&node_record_on_standby);
|
&node_record_on_standby);
|
||||||
|
|
||||||
if (node_record_result == 0)
|
if (node_record_status == RECORD_NOT_FOUND)
|
||||||
{
|
{
|
||||||
/* no record available yet on standby*/
|
/* no record available yet on standby*/
|
||||||
records_match = false;
|
records_match = false;
|
||||||
}
|
}
|
||||||
else if (node_record_result == 1)
|
else if (node_record_status == RECORD_FOUND)
|
||||||
{
|
{
|
||||||
/* compare relevant fields */
|
/* compare relevant fields */
|
||||||
if (node_record_on_standby.upstream_node_id != node_record_on_master.upstream_node_id)
|
if (node_record_on_standby.upstream_node_id != node_record_on_primary.upstream_node_id)
|
||||||
records_match = false;
|
records_match = false;
|
||||||
|
|
||||||
if (node_record_on_standby.type != node_record_on_master.type)
|
if (node_record_on_standby.type != node_record_on_primary.type)
|
||||||
records_match = false;
|
records_match = false;
|
||||||
|
|
||||||
if (node_record_on_standby.priority != node_record_on_master.priority)
|
if (node_record_on_standby.priority != node_record_on_primary.priority)
|
||||||
records_match = false;
|
records_match = false;
|
||||||
|
|
||||||
if (node_record_on_standby.active != node_record_on_master.active)
|
if (node_record_on_standby.active != node_record_on_primary.active)
|
||||||
records_match = false;
|
records_match = false;
|
||||||
|
|
||||||
if (strcmp(node_record_on_standby.node_name, node_record_on_master.node_name) != 0)
|
if (strcmp(node_record_on_standby.node_name, node_record_on_primary.node_name) != 0)
|
||||||
records_match = false;
|
records_match = false;
|
||||||
|
|
||||||
if (strcmp(node_record_on_standby.conninfo, node_record_on_master.conninfo) != 0)
|
if (strcmp(node_record_on_standby.conninfo, node_record_on_primary.conninfo) != 0)
|
||||||
records_match = false;
|
records_match = false;
|
||||||
|
|
||||||
if (strcmp(node_record_on_standby.slot_name, node_record_on_master.slot_name) != 0)
|
if (strcmp(node_record_on_standby.slot_name, node_record_on_primary.slot_name) != 0)
|
||||||
records_match = false;
|
records_match = false;
|
||||||
|
|
||||||
if (records_match == true)
|
if (records_match == true)
|
||||||
@@ -919,16 +920,16 @@ do_standby_register(void)
|
|||||||
{
|
{
|
||||||
log_error(_("node record was not synchronised after %i seconds"),
|
log_error(_("node record was not synchronised after %i seconds"),
|
||||||
runtime_options.wait_register_sync_seconds);
|
runtime_options.wait_register_sync_seconds);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_REGISTRATION_SYNC);
|
exit(ERR_REGISTRATION_SYNC);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info(_("node record on standby synchronised from master"));
|
log_info(_("node record on standby synchronised from primary"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
|
|
||||||
if (PQstatus(conn) == CONNECTION_OK)
|
if (PQstatus(conn) == CONNECTION_OK)
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
@@ -950,7 +951,7 @@ void
|
|||||||
do_standby_unregister(void)
|
do_standby_unregister(void)
|
||||||
{
|
{
|
||||||
PGconn *conn;
|
PGconn *conn;
|
||||||
PGconn *master_conn;
|
PGconn *primary_conn;
|
||||||
|
|
||||||
int target_node_id;
|
int target_node_id;
|
||||||
t_node_info node_info = T_NODE_INFO_INITIALIZER;
|
t_node_info node_info = T_NODE_INFO_INITIALIZER;
|
||||||
@@ -960,14 +961,14 @@ do_standby_unregister(void)
|
|||||||
log_info(_("connecting to local standby"));
|
log_info(_("connecting to local standby"));
|
||||||
conn = establish_db_connection(config_file_options.conninfo, true);
|
conn = establish_db_connection(config_file_options.conninfo, true);
|
||||||
|
|
||||||
/* check if there is a master in this cluster */
|
/* check if there is a primary in this cluster */
|
||||||
log_info(_("connecting to master database"));
|
log_info(_("connecting to primary database"));
|
||||||
|
|
||||||
master_conn = get_master_connection(conn, NULL, NULL);
|
primary_conn = get_primary_connection(conn, NULL, NULL);
|
||||||
|
|
||||||
if (PQstatus(master_conn) != CONNECTION_OK)
|
if (PQstatus(primary_conn) != CONNECTION_OK)
|
||||||
{
|
{
|
||||||
log_error(_("unable to connect to master server"));
|
log_error(_("unable to connect to primary server"));
|
||||||
log_detail("%s", PQerrorMessage(conn));
|
log_detail("%s", PQerrorMessage(conn));
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
@@ -983,10 +984,10 @@ do_standby_unregister(void)
|
|||||||
|
|
||||||
/* Check node exists and is really a standby */
|
/* Check node exists and is really a standby */
|
||||||
|
|
||||||
if (!get_node_record(master_conn, target_node_id, &node_info))
|
if (get_node_record(primary_conn, target_node_id, &node_info) != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_error(_("no record found for node %i"), target_node_id);
|
log_error(_("no record found for node %i"), target_node_id);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
@@ -994,32 +995,32 @@ do_standby_unregister(void)
|
|||||||
if (node_info.type != STANDBY)
|
if (node_info.type != STANDBY)
|
||||||
{
|
{
|
||||||
log_error(_("node %i is not a standby server"), target_node_id);
|
log_error(_("node %i is not a standby server"), target_node_id);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now unregister the standby */
|
/* Now unregister the standby */
|
||||||
log_notice(_("unregistering node %i"), target_node_id);
|
log_notice(_("unregistering node %i"), target_node_id);
|
||||||
node_record_deleted = delete_node_record(master_conn,
|
node_record_deleted = delete_node_record(primary_conn,
|
||||||
target_node_id);
|
target_node_id);
|
||||||
|
|
||||||
if (node_record_deleted == false)
|
if (node_record_deleted == false)
|
||||||
{
|
{
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Log the event */
|
/* Log the event */
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
target_node_id,
|
target_node_id,
|
||||||
"standby_unregister",
|
"standby_unregister",
|
||||||
true,
|
true,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
|
|
||||||
log_info(_("standby unregistration complete"));
|
log_info(_("standby unregistration complete"));
|
||||||
@@ -1038,7 +1039,7 @@ void
|
|||||||
do_standby_promote(void)
|
do_standby_promote(void)
|
||||||
{
|
{
|
||||||
PGconn *conn;
|
PGconn *conn;
|
||||||
PGconn *current_master_conn;
|
PGconn *current_primary_conn;
|
||||||
|
|
||||||
char script[MAXLEN];
|
char script[MAXLEN];
|
||||||
|
|
||||||
@@ -1053,7 +1054,7 @@ do_standby_promote(void)
|
|||||||
bool success;
|
bool success;
|
||||||
PQExpBufferData details;
|
PQExpBufferData details;
|
||||||
|
|
||||||
int existing_master_id = UNKNOWN_NODE_ID;
|
int existing_primary_id = UNKNOWN_NODE_ID;
|
||||||
|
|
||||||
log_info(_("connecting to standby database"));
|
log_info(_("connecting to standby database"));
|
||||||
conn = establish_db_connection(config_file_options.conninfo, true);
|
conn = establish_db_connection(config_file_options.conninfo, true);
|
||||||
@@ -1068,7 +1069,7 @@ do_standby_promote(void)
|
|||||||
|
|
||||||
if (recovery_type != RECTYPE_STANDBY)
|
if (recovery_type != RECTYPE_STANDBY)
|
||||||
{
|
{
|
||||||
if (recovery_type == RECTYPE_MASTER)
|
if (recovery_type == RECTYPE_PRIMARY)
|
||||||
{
|
{
|
||||||
log_error(_("STANDBY PROMOTE can only be executed on a standby node"));
|
log_error(_("STANDBY PROMOTE can only be executed on a standby node"));
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
@@ -1083,25 +1084,25 @@ do_standby_promote(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* check that there's no existing master */
|
/* check that there's no existing primary */
|
||||||
current_master_conn = get_master_connection_quiet(conn, &existing_master_id, NULL);
|
current_primary_conn = get_primary_connection_quiet(conn, &existing_primary_id, NULL);
|
||||||
|
|
||||||
if (PQstatus(current_master_conn) == CONNECTION_OK)
|
if (PQstatus(current_primary_conn) == CONNECTION_OK)
|
||||||
{
|
{
|
||||||
log_error(_("this cluster already has an active master server"));
|
log_error(_("this cluster already has an active primary server"));
|
||||||
|
|
||||||
if (existing_master_id != UNKNOWN_NODE_ID)
|
if (existing_primary_id != UNKNOWN_NODE_ID)
|
||||||
{
|
{
|
||||||
t_node_info master_rec;
|
t_node_info primary_rec;
|
||||||
|
|
||||||
get_node_record(conn, existing_master_id, &master_rec);
|
get_node_record(conn, existing_primary_id, &primary_rec);
|
||||||
|
|
||||||
log_detail(_("current master is %s (node_id: %i)"),
|
log_detail(_("current primary is %s (node_id: %i)"),
|
||||||
master_rec.node_name,
|
primary_rec.node_name,
|
||||||
existing_master_id);
|
existing_primary_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
PQfinish(current_master_conn);
|
PQfinish(current_primary_conn);
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
exit(ERR_PROMOTION_FAIL);
|
exit(ERR_PROMOTION_FAIL);
|
||||||
}
|
}
|
||||||
@@ -1121,7 +1122,7 @@ do_standby_promote(void)
|
|||||||
log_notice(_("promoting standby"));
|
log_notice(_("promoting standby"));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Promote standby to master.
|
* Promote standby to primary.
|
||||||
*
|
*
|
||||||
* `pg_ctl promote` returns immediately and (prior to 10.0) has no -w option
|
* `pg_ctl promote` returns immediately and (prior to 10.0) has no -w option
|
||||||
* so we can't be sure when or if the promotion completes.
|
* so we can't be sure when or if the promotion completes.
|
||||||
@@ -1144,7 +1145,7 @@ do_standby_promote(void)
|
|||||||
r = system(script);
|
r = system(script);
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
{
|
{
|
||||||
log_error(_("unable to promote server from standby to master"));
|
log_error(_("unable to promote server from standby to primary"));
|
||||||
exit(ERR_PROMOTION_FAIL);
|
exit(ERR_PROMOTION_FAIL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1157,7 +1158,7 @@ do_standby_promote(void)
|
|||||||
{
|
{
|
||||||
|
|
||||||
recovery_type = get_recovery_type(conn);
|
recovery_type = get_recovery_type(conn);
|
||||||
if (recovery_type == RECTYPE_MASTER)
|
if (recovery_type == RECTYPE_PRIMARY)
|
||||||
{
|
{
|
||||||
promote_success = true;
|
promote_success = true;
|
||||||
break;
|
break;
|
||||||
@@ -1183,7 +1184,7 @@ do_standby_promote(void)
|
|||||||
|
|
||||||
|
|
||||||
/* update node information to reflect new status */
|
/* update node information to reflect new status */
|
||||||
if (update_node_record_set_master(conn, config_file_options.node_id) == false)
|
if (update_node_record_set_primary(conn, config_file_options.node_id) == false)
|
||||||
{
|
{
|
||||||
initPQExpBuffer(&details);
|
initPQExpBuffer(&details);
|
||||||
appendPQExpBuffer(&details,
|
appendPQExpBuffer(&details,
|
||||||
@@ -1205,7 +1206,7 @@ do_standby_promote(void)
|
|||||||
|
|
||||||
initPQExpBuffer(&details);
|
initPQExpBuffer(&details);
|
||||||
appendPQExpBuffer(&details,
|
appendPQExpBuffer(&details,
|
||||||
_("node %i was successfully promoted to master"),
|
_("node %i was successfully promoted to primary"),
|
||||||
config_file_options.node_id);
|
config_file_options.node_id);
|
||||||
|
|
||||||
log_notice(_("STANDBY PROMOTE successful"));
|
log_notice(_("STANDBY PROMOTE successful"));
|
||||||
@@ -1243,9 +1244,9 @@ do_standby_follow(void)
|
|||||||
t_node_info local_node_record = T_NODE_INFO_INITIALIZER;
|
t_node_info local_node_record = T_NODE_INFO_INITIALIZER;
|
||||||
int original_upstream_node_id = UNKNOWN_NODE_ID;
|
int original_upstream_node_id = UNKNOWN_NODE_ID;
|
||||||
|
|
||||||
PGconn *master_conn = NULL;
|
PGconn *primary_conn = NULL;
|
||||||
int master_id = UNKNOWN_NODE_ID;
|
int primary_id = UNKNOWN_NODE_ID;
|
||||||
t_node_info master_node_record = T_NODE_INFO_INITIALIZER;
|
t_node_info primary_node_record = T_NODE_INFO_INITIALIZER;
|
||||||
|
|
||||||
char data_dir[MAXPGPATH];
|
char data_dir[MAXPGPATH];
|
||||||
t_conninfo_param_list recovery_conninfo;
|
t_conninfo_param_list recovery_conninfo;
|
||||||
@@ -1285,32 +1286,32 @@ do_standby_follow(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Attempt to connect to master.
|
* Attempt to connect to primary.
|
||||||
*
|
*
|
||||||
* If --wait provided, loop for up `master_response_timeout`
|
* If --wait provided, loop for up `primary_response_timeout`
|
||||||
* seconds before giving up
|
* seconds before giving up
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (timer = 0; timer < config_file_options.master_response_timeout; timer++)
|
for (timer = 0; timer < config_file_options.primary_response_timeout; timer++)
|
||||||
{
|
{
|
||||||
master_conn = get_master_connection_quiet(local_conn,
|
primary_conn = get_primary_connection_quiet(local_conn,
|
||||||
&master_id,
|
&primary_id,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (PQstatus(master_conn) == CONNECTION_OK || runtime_options.wait == false)
|
if (PQstatus(primary_conn) == CONNECTION_OK || runtime_options.wait == false)
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PQstatus(master_conn) != CONNECTION_OK)
|
if (PQstatus(primary_conn) != CONNECTION_OK)
|
||||||
{
|
{
|
||||||
log_error(_("unable to determine master node"));
|
log_error(_("unable to determine primary node"));
|
||||||
PQfinish(local_conn);
|
PQfinish(local_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
check_master_standby_version_match(local_conn, master_conn);
|
check_primary_standby_version_match(local_conn, primary_conn);
|
||||||
|
|
||||||
PQfinish(local_conn);
|
PQfinish(local_conn);
|
||||||
}
|
}
|
||||||
@@ -1321,20 +1322,20 @@ do_standby_follow(void)
|
|||||||
*/
|
*/
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
master_conn = establish_db_connection_by_params(
|
primary_conn = establish_db_connection_by_params(
|
||||||
(const char**)source_conninfo.keywords,
|
(const char**)source_conninfo.keywords,
|
||||||
(const char**)source_conninfo.values,
|
(const char**)source_conninfo.values,
|
||||||
true);
|
true);
|
||||||
|
|
||||||
master_id = get_master_node_id(master_conn);
|
primary_id = get_primary_node_id(primary_conn);
|
||||||
strncpy(data_dir, runtime_options.data_dir, MAXPGPATH);
|
strncpy(data_dir, runtime_options.data_dir, MAXPGPATH);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (get_recovery_type(master_conn) != RECTYPE_MASTER)
|
if (get_recovery_type(primary_conn) != RECTYPE_PRIMARY)
|
||||||
{
|
{
|
||||||
log_error(_("the node to follow is not a master"));
|
log_error(_("the node to follow is not a primary"));
|
||||||
// XXX log detail
|
// XXX log detail
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1342,55 +1343,55 @@ do_standby_follow(void)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* If 9.4 or later, and replication slots in use, we'll need to create a
|
* If 9.4 or later, and replication slots in use, we'll need to create a
|
||||||
* slot on the new master
|
* slot on the new primary
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (config_file_options.use_replication_slots)
|
if (config_file_options.use_replication_slots)
|
||||||
{
|
{
|
||||||
int server_version_num = get_server_version(master_conn, NULL);
|
int server_version_num = get_server_version(primary_conn, NULL);
|
||||||
|
|
||||||
PQExpBufferData event_details;
|
PQExpBufferData event_details;
|
||||||
initPQExpBuffer(&event_details);
|
initPQExpBuffer(&event_details);
|
||||||
|
|
||||||
if (create_replication_slot(master_conn, repmgr_slot_name, server_version_num, &event_details) == false)
|
if (create_replication_slot(primary_conn, repmgr_slot_name, server_version_num, &event_details) == false)
|
||||||
{
|
{
|
||||||
log_error("%s", event_details.data);
|
log_error("%s", event_details.data);
|
||||||
|
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"standby_follow",
|
"standby_follow",
|
||||||
false,
|
false,
|
||||||
event_details.data);
|
event_details.data);
|
||||||
|
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_DB_QUERY);
|
exit(ERR_DB_QUERY);
|
||||||
}
|
}
|
||||||
|
|
||||||
termPQExpBuffer(&event_details);
|
termPQExpBuffer(&event_details);
|
||||||
}
|
}
|
||||||
|
|
||||||
get_node_record(master_conn, master_id, &master_node_record);
|
get_node_record(primary_conn, primary_id, &primary_node_record);
|
||||||
|
|
||||||
/* Initialise connection parameters to write as `primary_conninfo` */
|
/* Initialise connection parameters to write as `primary_conninfo` */
|
||||||
initialize_conninfo_params(&recovery_conninfo, false);
|
initialize_conninfo_params(&recovery_conninfo, false);
|
||||||
|
|
||||||
/* We ignore any application_name set in the master's conninfo */
|
/* We ignore any application_name set in the primary's conninfo */
|
||||||
parse_conninfo_string(master_node_record.conninfo, &recovery_conninfo, errmsg, true);
|
parse_conninfo_string(primary_node_record.conninfo, &recovery_conninfo, errmsg, true);
|
||||||
|
|
||||||
|
|
||||||
/* Set the default application name to this node's name */
|
/* Set the default application name to this node's name */
|
||||||
param_set(&recovery_conninfo, "application_name", config_file_options.node_name);
|
param_set(&recovery_conninfo, "application_name", config_file_options.node_name);
|
||||||
|
|
||||||
/* Set the replication user from the master node record */
|
/* Set the replication user from the primary node record */
|
||||||
param_set(&recovery_conninfo, "user", master_node_record.repluser);
|
param_set(&recovery_conninfo, "user", primary_node_record.repluser);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Fetch our node record so we can write application_name, if set,
|
* Fetch our node record so we can write application_name, if set,
|
||||||
* and to get the upstream node ID, which we'll need to know if
|
* and to get the upstream node ID, which we'll need to know if
|
||||||
* replication slots are in use and we want to delete the old slot.
|
* replication slots are in use and we want to delete the old slot.
|
||||||
*/
|
*/
|
||||||
record_status = get_node_record(master_conn,
|
record_status = get_node_record(primary_conn,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
&local_node_record);
|
&local_node_record);
|
||||||
|
|
||||||
@@ -1433,16 +1434,16 @@ do_standby_follow(void)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
original_upstream_node_id = master_id;
|
original_upstream_node_id = primary_id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log_info(_("changing node %i's master to node %i"),
|
log_info(_("changing node %i's primary to node %i"),
|
||||||
config_file_options.node_id, master_id);
|
config_file_options.node_id, primary_id);
|
||||||
|
|
||||||
if (!create_recovery_file(data_dir, &recovery_conninfo))
|
if (!create_recovery_file(data_dir, &recovery_conninfo))
|
||||||
{
|
{
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1471,7 +1472,7 @@ do_standby_follow(void)
|
|||||||
if (r != 0)
|
if (r != 0)
|
||||||
{
|
{
|
||||||
log_error(_("unable to restart server"));
|
log_error(_("unable to restart server"));
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_NO_RESTART);
|
exit(ERR_NO_RESTART);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1480,7 +1481,7 @@ do_standby_follow(void)
|
|||||||
* If replication slots are in use, and an inactive one for this node
|
* If replication slots are in use, and an inactive one for this node
|
||||||
* exists on the former upstream, drop it.
|
* exists on the former upstream, drop it.
|
||||||
*
|
*
|
||||||
* XXX check if former upstream is current master?
|
* XXX check if former upstream is current primary?
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (config_file_options.use_replication_slots && runtime_options.host_param_provided == false && original_upstream_node_id != UNKNOWN_NODE_ID)
|
if (config_file_options.use_replication_slots && runtime_options.host_param_provided == false && original_upstream_node_id != UNKNOWN_NODE_ID)
|
||||||
@@ -1528,28 +1529,28 @@ do_standby_follow(void)
|
|||||||
* It's possible this node was an inactive primary - update the
|
* It's possible this node was an inactive primary - update the
|
||||||
* relevant fields to ensure it's marked as an active standby
|
* relevant fields to ensure it's marked as an active standby
|
||||||
*/
|
*/
|
||||||
if (update_node_record_status(master_conn,
|
if (update_node_record_status(primary_conn,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"standby",
|
"standby",
|
||||||
master_id,
|
primary_id,
|
||||||
true) == false)
|
true) == false)
|
||||||
{
|
{
|
||||||
log_error(_("unable to update upstream node"));
|
log_error(_("unable to update upstream node"));
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
|
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_notice(_("STANDBY FOLLOW successful"));
|
log_notice(_("STANDBY FOLLOW successful"));
|
||||||
|
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"standby_follow",
|
"standby_follow",
|
||||||
true,
|
true,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1616,7 +1617,7 @@ check_source_server()
|
|||||||
/* Verify that upstream node is a supported server version */
|
/* Verify that upstream node is a supported server version */
|
||||||
log_verbose(LOG_INFO, _("connected to source node, checking its state"));
|
log_verbose(LOG_INFO, _("connected to source node, checking its state"));
|
||||||
|
|
||||||
server_version_num = check_server_version(source_conn, "master", true, NULL);
|
server_version_num = check_server_version(source_conn, "primary", true, NULL);
|
||||||
|
|
||||||
check_upstream_config(source_conn, server_version_num, true);
|
check_upstream_config(source_conn, server_version_num, true);
|
||||||
|
|
||||||
@@ -1648,22 +1649,22 @@ check_source_server()
|
|||||||
*/
|
*/
|
||||||
if (get_recovery_type(source_conn) == RECTYPE_STANDBY)
|
if (get_recovery_type(source_conn) == RECTYPE_STANDBY)
|
||||||
{
|
{
|
||||||
master_conn = get_master_connection(source_conn, NULL, NULL);
|
primary_conn = get_primary_connection(source_conn, NULL, NULL);
|
||||||
|
|
||||||
// XXX check this worked?
|
// XXX check this worked?
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
master_conn = source_conn;
|
primary_conn = source_conn;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Sanity-check that the master node has a repmgr schema - if not
|
* Sanity-check that the primary node has a repmgr schema - if not
|
||||||
* present, fail with an error unless -F/--force is used (to enable
|
* present, fail with an error unless -F/--force is used (to enable
|
||||||
* repmgr to be used as a standalone clone tool)
|
* repmgr to be used as a standalone clone tool)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
extension_status = get_repmgr_extension_status(master_conn);
|
extension_status = get_repmgr_extension_status(primary_conn);
|
||||||
|
|
||||||
if (extension_status != REPMGR_INSTALLED)
|
if (extension_status != REPMGR_INSTALLED)
|
||||||
{
|
{
|
||||||
@@ -1751,7 +1752,7 @@ check_source_server()
|
|||||||
* Attempt to find the upstream node record
|
* Attempt to find the upstream node record
|
||||||
*/
|
*/
|
||||||
if (config_file_options.upstream_node_id == NO_UPSTREAM_NODE)
|
if (config_file_options.upstream_node_id == NO_UPSTREAM_NODE)
|
||||||
upstream_node_id = get_master_node_id(source_conn);
|
upstream_node_id = get_primary_node_id(source_conn);
|
||||||
else
|
else
|
||||||
upstream_node_id = config_file_options.upstream_node_id;
|
upstream_node_id = config_file_options.upstream_node_id;
|
||||||
|
|
||||||
@@ -2087,7 +2088,7 @@ initialise_direct_clone(void)
|
|||||||
{
|
{
|
||||||
log_error("%s", event_details.data);
|
log_error("%s", event_details.data);
|
||||||
|
|
||||||
create_event_record(master_conn,
|
create_event_record(primary_conn,
|
||||||
&config_file_options,
|
&config_file_options,
|
||||||
config_file_options.node_id,
|
config_file_options.node_id,
|
||||||
"standby_clone",
|
"standby_clone",
|
||||||
@@ -2210,7 +2211,7 @@ run_basebackup(void)
|
|||||||
*
|
*
|
||||||
* From 9.6, if replication slots are in use, we'll have previously
|
* From 9.6, if replication slots are in use, we'll have previously
|
||||||
* created a slot with reserved LSN, and will stream from that slot to avoid
|
* created a slot with reserved LSN, and will stream from that slot to avoid
|
||||||
* WAL buildup on the master using the -S/--slot, which requires -X/--xlog-method=stream
|
* WAL buildup on the primary using the -S/--slot, which requires -X/--xlog-method=stream
|
||||||
* (from 10, -X/--wal-method=stream)
|
* (from 10, -X/--wal-method=stream)
|
||||||
*/
|
*/
|
||||||
if (!strlen(backup_options.xlog_method))
|
if (!strlen(backup_options.xlog_method))
|
||||||
@@ -2951,7 +2952,7 @@ tablespace_data_append(TablespaceDataList *list, const char *name, const char *o
|
|||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* check_master_standby_version_match()
|
* check_primary_standby_version_match()
|
||||||
*
|
*
|
||||||
* Check server versions of supplied connections are compatible for
|
* Check server versions of supplied connections are compatible for
|
||||||
* replication purposes.
|
* replication purposes.
|
||||||
@@ -2959,32 +2960,32 @@ tablespace_data_append(TablespaceDataList *list, const char *name, const char *o
|
|||||||
* Exits on error.
|
* Exits on error.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
check_master_standby_version_match(PGconn *conn, PGconn *master_conn)
|
check_primary_standby_version_match(PGconn *conn, PGconn *primary_conn)
|
||||||
{
|
{
|
||||||
char standby_version[MAXVERSIONSTR];
|
char standby_version[MAXVERSIONSTR];
|
||||||
int standby_version_num = 0;
|
int standby_version_num = 0;
|
||||||
|
|
||||||
char master_version[MAXVERSIONSTR];
|
char primary_version[MAXVERSIONSTR];
|
||||||
int master_version_num = 0;
|
int primary_version_num = 0;
|
||||||
|
|
||||||
standby_version_num = check_server_version(conn, "standby", true, standby_version);
|
standby_version_num = check_server_version(conn, "standby", true, standby_version);
|
||||||
|
|
||||||
/* Verify that master is a supported server version */
|
/* Verify that primary is a supported server version */
|
||||||
master_version_num = check_server_version(conn, "master", false, master_version);
|
primary_version_num = check_server_version(conn, "primary", false, primary_version);
|
||||||
if (master_version_num < 0)
|
if (primary_version_num < 0)
|
||||||
{
|
{
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* master and standby version should match */
|
/* primary and standby version should match */
|
||||||
if ((master_version_num / 100) != (standby_version_num / 100))
|
if ((primary_version_num / 100) != (standby_version_num / 100))
|
||||||
{
|
{
|
||||||
PQfinish(conn);
|
PQfinish(conn);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
log_error(_("PostgreSQL versions on master (%s) and standby (%s) must match"),
|
log_error(_("PostgreSQL versions on primary (%s) and standby (%s) must match"),
|
||||||
master_version, standby_version);
|
primary_version, standby_version);
|
||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2997,7 +2998,7 @@ check_recovery_type(PGconn *conn)
|
|||||||
|
|
||||||
if (recovery_type != RECTYPE_STANDBY)
|
if (recovery_type != RECTYPE_STANDBY)
|
||||||
{
|
{
|
||||||
if (recovery_type == RECTYPE_MASTER)
|
if (recovery_type == RECTYPE_PRIMARY)
|
||||||
{
|
{
|
||||||
log_error(_("this node should be a standby (%s)"),
|
log_error(_("this node should be a standby (%s)"),
|
||||||
config_file_options.conninfo);
|
config_file_options.conninfo);
|
||||||
|
|||||||
@@ -8,8 +8,8 @@
|
|||||||
*
|
*
|
||||||
* Commands implemented are:
|
* Commands implemented are:
|
||||||
*
|
*
|
||||||
* [ MASTER | PRIMARY ] REGISTER
|
* [ PRIMARY | MASTER ] REGISTER
|
||||||
* [ MASTER | PRIMARY ] UNREGISTER
|
* [ PRIMARY | MASTER ] UNREGISTER
|
||||||
*
|
*
|
||||||
* STANDBY CLONE
|
* STANDBY CLONE
|
||||||
* STANDBY REGISTER
|
* STANDBY REGISTER
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
#include "repmgr-client.h"
|
#include "repmgr-client.h"
|
||||||
#include "repmgr-client-global.h"
|
#include "repmgr-client-global.h"
|
||||||
#include "repmgr-action-master.h"
|
#include "repmgr-action-primary.h"
|
||||||
#include "repmgr-action-standby.h"
|
#include "repmgr-action-standby.h"
|
||||||
#include "repmgr-action-cluster.h"
|
#include "repmgr-action-cluster.h"
|
||||||
|
|
||||||
@@ -204,7 +204,7 @@ main(int argc, char **argv)
|
|||||||
runtime_options.force = true;
|
runtime_options.force = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* --replication-user (master/standby register only) */
|
/* --replication-user (primary/standby register only) */
|
||||||
case OPT_REPLICATION_USER:
|
case OPT_REPLICATION_USER:
|
||||||
strncpy(runtime_options.replication_user, optarg, MAXLEN);
|
strncpy(runtime_options.replication_user, optarg, MAXLEN);
|
||||||
break;
|
break;
|
||||||
@@ -546,7 +546,7 @@ main(int argc, char **argv)
|
|||||||
/*
|
/*
|
||||||
* Determine the node type and action; following are valid:
|
* Determine the node type and action; following are valid:
|
||||||
*
|
*
|
||||||
* { MASTER | PRIMARY } REGISTER |
|
* { PRIMARY | MASTER } REGISTER |
|
||||||
* STANDBY {REGISTER | UNREGISTER | CLONE [node] | PROMOTE | FOLLOW [node] | SWITCHOVER | REWIND} |
|
* STANDBY {REGISTER | UNREGISTER | CLONE [node] | PROMOTE | FOLLOW [node] | SWITCHOVER | REWIND} |
|
||||||
* WITNESS { CREATE | REGISTER | UNREGISTER } |
|
* WITNESS { CREATE | REGISTER | UNREGISTER } |
|
||||||
* BDR { REGISTER | UNREGISTER } |
|
* BDR { REGISTER | UNREGISTER } |
|
||||||
@@ -570,12 +570,12 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if (repmgr_node_type != NULL)
|
if (repmgr_node_type != NULL)
|
||||||
{
|
{
|
||||||
if (strcasecmp(repmgr_node_type, "MASTER") == 0 || strcasecmp(repmgr_node_type, "PRIMARY") == 0 )
|
if (strcasecmp(repmgr_node_type, "PRIMARY") == 0 || strcasecmp(repmgr_node_type, "MASTER") == 0 )
|
||||||
{
|
{
|
||||||
if (strcasecmp(repmgr_action, "REGISTER") == 0)
|
if (strcasecmp(repmgr_action, "REGISTER") == 0)
|
||||||
action = MASTER_REGISTER;
|
action = PRIMARY_REGISTER;
|
||||||
else if (strcasecmp(repmgr_action, "UNREGISTER") == 0)
|
else if (strcasecmp(repmgr_action, "UNREGISTER") == 0)
|
||||||
action = MASTER_UNREGISTER;
|
action = PRIMARY_UNREGISTER;
|
||||||
}
|
}
|
||||||
else if (strcasecmp(repmgr_node_type, "STANDBY") == 0)
|
else if (strcasecmp(repmgr_node_type, "STANDBY") == 0)
|
||||||
{
|
{
|
||||||
@@ -784,16 +784,16 @@ main(int argc, char **argv)
|
|||||||
if (runtime_options.node_id != UNKNOWN_NODE_ID || runtime_options.node_name[0] != '\0')
|
if (runtime_options.node_id != UNKNOWN_NODE_ID || runtime_options.node_name[0] != '\0')
|
||||||
{
|
{
|
||||||
PGconn *conn;
|
PGconn *conn;
|
||||||
int record_found;
|
RecordStatus record_status;
|
||||||
|
|
||||||
log_verbose(LOG_DEBUG, "connecting to local node to retrieve record for node specified with --node-id or --node-name");
|
log_verbose(LOG_DEBUG, "connecting to local node to retrieve record for node specified with --node-id or --node-name");
|
||||||
conn = establish_db_connection(config_file_options.conninfo, true);
|
conn = establish_db_connection(config_file_options.conninfo, true);
|
||||||
|
|
||||||
if (runtime_options.node_id != UNKNOWN_NODE_ID)
|
if (runtime_options.node_id != UNKNOWN_NODE_ID)
|
||||||
{
|
{
|
||||||
record_found = get_node_record(conn, runtime_options.node_id, &target_node_info);
|
record_status = get_node_record(conn, runtime_options.node_id, &target_node_info);
|
||||||
|
|
||||||
if (!record_found)
|
if (record_status != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_error(_("node %i (specified with --node-id) not found"),
|
log_error(_("node %i (specified with --node-id) not found"),
|
||||||
runtime_options.node_id);
|
runtime_options.node_id);
|
||||||
@@ -811,10 +811,10 @@ main(int argc, char **argv)
|
|||||||
exit(ERR_BAD_CONFIG);
|
exit(ERR_BAD_CONFIG);
|
||||||
}
|
}
|
||||||
|
|
||||||
record_found = get_node_record_by_name(conn, escaped, &target_node_info);
|
record_status = get_node_record_by_name(conn, escaped, &target_node_info);
|
||||||
|
|
||||||
pfree(escaped);
|
pfree(escaped);
|
||||||
if (!record_found)
|
if (record_status != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_error(_("node %s (specified with --node-name) not found"),
|
log_error(_("node %s (specified with --node-name) not found"),
|
||||||
runtime_options.node_name);
|
runtime_options.node_name);
|
||||||
@@ -830,7 +830,7 @@ main(int argc, char **argv)
|
|||||||
* Initialise slot name, if required (9.4 and later)
|
* Initialise slot name, if required (9.4 and later)
|
||||||
*
|
*
|
||||||
* NOTE: the slot name will be defined for each record, including
|
* NOTE: the slot name will be defined for each record, including
|
||||||
* the master; the `slot_name` column in `repl_nodes` defines
|
* the primary; the `slot_name` column in `repl_nodes` defines
|
||||||
* the name of the slot, but does not imply a slot has been created.
|
* the name of the slot, but does not imply a slot has been created.
|
||||||
* The version check for 9.4 or later is done in check_upstream_config()
|
* The version check for 9.4 or later is done in check_upstream_config()
|
||||||
*/
|
*/
|
||||||
@@ -843,11 +843,11 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MASTER_REGISTER:
|
case PRIMARY_REGISTER:
|
||||||
do_master_register();
|
do_primary_register();
|
||||||
break;
|
break;
|
||||||
case MASTER_UNREGISTER:
|
case PRIMARY_UNREGISTER:
|
||||||
do_master_unregister();
|
do_primary_unregister();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case STANDBY_CLONE:
|
case STANDBY_CLONE:
|
||||||
@@ -910,7 +910,7 @@ check_cli_parameters(const int action)
|
|||||||
*/
|
*/
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MASTER_REGISTER:
|
case PRIMARY_REGISTER:
|
||||||
/* no required parameters */
|
/* no required parameters */
|
||||||
break;
|
break;
|
||||||
case STANDBY_CLONE:
|
case STANDBY_CLONE:
|
||||||
@@ -1041,7 +1041,7 @@ check_cli_parameters(const int action)
|
|||||||
{
|
{
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MASTER_UNREGISTER:
|
case PRIMARY_UNREGISTER:
|
||||||
case STANDBY_UNREGISTER:
|
case STANDBY_UNREGISTER:
|
||||||
case WITNESS_UNREGISTER:
|
case WITNESS_UNREGISTER:
|
||||||
case CLUSTER_EVENT:
|
case CLUSTER_EVENT:
|
||||||
@@ -1093,7 +1093,7 @@ check_cli_parameters(const int action)
|
|||||||
{
|
{
|
||||||
switch (action)
|
switch (action)
|
||||||
{
|
{
|
||||||
case MASTER_REGISTER:
|
case PRIMARY_REGISTER:
|
||||||
case STANDBY_REGISTER:
|
case STANDBY_REGISTER:
|
||||||
break;
|
break;
|
||||||
case STANDBY_CLONE:
|
case STANDBY_CLONE:
|
||||||
@@ -1153,8 +1153,8 @@ action_name(const int action)
|
|||||||
{
|
{
|
||||||
switch(action)
|
switch(action)
|
||||||
{
|
{
|
||||||
case MASTER_REGISTER:
|
case PRIMARY_REGISTER:
|
||||||
return "MASTER REGISTER";
|
return "PRIMARY REGISTER";
|
||||||
case STANDBY_CLONE:
|
case STANDBY_CLONE:
|
||||||
return "STANDBY CLONE";
|
return "STANDBY CLONE";
|
||||||
case STANDBY_REGISTER:
|
case STANDBY_REGISTER:
|
||||||
@@ -1208,8 +1208,8 @@ do_help(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
printf(_("Usage:\n"));
|
printf(_("Usage:\n"));
|
||||||
printf(_(" %s [OPTIONS] master register\n"), progname());
|
printf(_(" %s [OPTIONS] primary register\n"), progname());
|
||||||
printf(_(" %s [OPTIONS] master unregister\n"), progname());
|
printf(_(" %s [OPTIONS] primary unregister\n"), progname());
|
||||||
printf(_(" %s [OPTIONS] standby clone\n"), progname());
|
printf(_(" %s [OPTIONS] standby clone\n"), progname());
|
||||||
printf(_(" %s [OPTIONS] standby register\n"), progname());
|
printf(_(" %s [OPTIONS] standby register\n"), progname());
|
||||||
printf(_(" %s [OPTIONS] standby unregister\n"), progname());
|
printf(_(" %s [OPTIONS] standby unregister\n"), progname());
|
||||||
@@ -1416,7 +1416,7 @@ create_repmgr_extension(PGconn *conn)
|
|||||||
* the connection to check
|
* the connection to check
|
||||||
*
|
*
|
||||||
* char *server_type:
|
* char *server_type:
|
||||||
* either "master" or "standby"; used to format error message
|
* either "primary" or "standby"; used to format error message
|
||||||
*
|
*
|
||||||
* bool exit_on_error:
|
* bool exit_on_error:
|
||||||
* exit if reported server version is too low; optional to enable some callers
|
* exit if reported server version is too low; optional to enable some callers
|
||||||
|
|||||||
@@ -12,8 +12,8 @@
|
|||||||
|
|
||||||
|
|
||||||
#define NO_ACTION 0 /* Dummy default action */
|
#define NO_ACTION 0 /* Dummy default action */
|
||||||
#define MASTER_REGISTER 1
|
#define PRIMARY_REGISTER 1
|
||||||
#define MASTER_UNREGISTER 2
|
#define PRIMARY_UNREGISTER 2
|
||||||
#define STANDBY_REGISTER 3
|
#define STANDBY_REGISTER 3
|
||||||
#define STANDBY_UNREGISTER 4
|
#define STANDBY_UNREGISTER 4
|
||||||
#define STANDBY_CLONE 5
|
#define STANDBY_CLONE 5
|
||||||
|
|||||||
24
repmgrd.c
24
repmgrd.c
@@ -24,7 +24,7 @@ t_configuration_options config_file_options = T_CONFIGURATION_OPTIONS_INITIALIZE
|
|||||||
static t_node_info local_node_info = T_NODE_INFO_INITIALIZER;
|
static t_node_info local_node_info = T_NODE_INFO_INITIALIZER;
|
||||||
static PGconn *local_conn = NULL;
|
static PGconn *local_conn = NULL;
|
||||||
|
|
||||||
static PGconn *master_conn = NULL;
|
static PGconn *primary_conn = NULL;
|
||||||
|
|
||||||
/* Collate command line errors here for friendlier reporting */
|
/* Collate command line errors here for friendlier reporting */
|
||||||
static ItemList cli_errors = { NULL, NULL };
|
static ItemList cli_errors = { NULL, NULL };
|
||||||
@@ -41,7 +41,7 @@ static void daemonize_process(void);
|
|||||||
static void check_and_create_pid_file(const char *pid_file);
|
static void check_and_create_pid_file(const char *pid_file);
|
||||||
|
|
||||||
static void start_monitoring(void);
|
static void start_monitoring(void);
|
||||||
static void monitor_streaming_master(void);
|
static void monitor_streaming_primary(void);
|
||||||
static void monitor_streaming_standby(void);
|
static void monitor_streaming_standby(void);
|
||||||
|
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
@@ -248,7 +248,7 @@ main(int argc, char **argv)
|
|||||||
if (record_status != RECORD_FOUND)
|
if (record_status != RECORD_FOUND)
|
||||||
{
|
{
|
||||||
log_error(_("no metadata record found for this node - terminating"));
|
log_error(_("no metadata record found for this node - terminating"));
|
||||||
log_hint(_("Check that 'repmgr (master|standby) register' was executed for this node"));
|
log_hint(_("Check that 'repmgr (primary|standby) register' was executed for this node"));
|
||||||
|
|
||||||
PQfinish(local_conn);
|
PQfinish(local_conn);
|
||||||
terminate(ERR_BAD_CONFIG);
|
terminate(ERR_BAD_CONFIG);
|
||||||
@@ -271,7 +271,7 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
if (local_node_info.active == false)
|
if (local_node_info.active == false)
|
||||||
{
|
{
|
||||||
char *hint = "Check that 'repmgr (master|standby) register' was executed for this node";
|
char *hint = "Check that 'repmgr (primary|standby) register' was executed for this node";
|
||||||
|
|
||||||
switch (config_file_options.failover_mode)
|
switch (config_file_options.failover_mode)
|
||||||
{
|
{
|
||||||
@@ -354,8 +354,8 @@ start_monitoring(void)
|
|||||||
{
|
{
|
||||||
switch (local_node_info.type)
|
switch (local_node_info.type)
|
||||||
{
|
{
|
||||||
case MASTER:
|
case PRIMARY:
|
||||||
monitor_streaming_master();
|
monitor_streaming_primary();
|
||||||
break;
|
break;
|
||||||
case STANDBY:
|
case STANDBY:
|
||||||
monitor_streaming_standby();
|
monitor_streaming_standby();
|
||||||
@@ -372,7 +372,7 @@ start_monitoring(void)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
monitor_streaming_master(void)
|
monitor_streaming_primary(void)
|
||||||
{
|
{
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
@@ -586,12 +586,12 @@ show_help(void)
|
|||||||
static void
|
static void
|
||||||
close_connections()
|
close_connections()
|
||||||
{
|
{
|
||||||
if (PQstatus(master_conn) == CONNECTION_OK)
|
if (PQstatus(primary_conn) == CONNECTION_OK)
|
||||||
{
|
{
|
||||||
/* cancel any pending queries to the master */
|
/* cancel any pending queries to the primary */
|
||||||
if (PQisBusy(master_conn) == 1)
|
if (PQisBusy(primary_conn) == 1)
|
||||||
cancel_query(master_conn, config_file_options.master_response_timeout);
|
cancel_query(primary_conn, config_file_options.primary_response_timeout);
|
||||||
PQfinish(master_conn);
|
PQfinish(primary_conn);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PQstatus(local_conn) == CONNECTION_OK)
|
if (PQstatus(local_conn) == CONNECTION_OK)
|
||||||
|
|||||||
Reference in New Issue
Block a user