mirror of
https://github.com/EnterpriseDB/repmgr.git
synced 2026-03-27 00:46:29 +00:00
Use stored node configuration file path when executing remote commands
Makes life much easier.
This commit is contained in:
@@ -1571,6 +1571,7 @@ _populate_node_record(PGresult *res, t_node_info *node_info, int row)
|
|||||||
strncpy(node_info->location, PQgetvalue(res, row, 7), MAXLEN);
|
strncpy(node_info->location, PQgetvalue(res, row, 7), MAXLEN);
|
||||||
node_info->priority = atoi(PQgetvalue(res, row, 8));
|
node_info->priority = atoi(PQgetvalue(res, row, 8));
|
||||||
node_info->active = atobool(PQgetvalue(res, row, 9));
|
node_info->active = atobool(PQgetvalue(res, row, 9));
|
||||||
|
strncpy(node_info->config_file, PQgetvalue(res, row, 10), MAXLEN);
|
||||||
|
|
||||||
/* This won't normally be set */
|
/* This won't normally be set */
|
||||||
strncpy(node_info->upstream_node_name, PQgetvalue(res, row, 10), MAXLEN);
|
strncpy(node_info->upstream_node_name, PQgetvalue(res, row, 10), MAXLEN);
|
||||||
|
|||||||
@@ -1648,7 +1648,7 @@ do_standby_switchover(void)
|
|||||||
* Check this standby is attached to the demotion candidate
|
* Check this standby is attached to the demotion candidate
|
||||||
* TODO:
|
* TODO:
|
||||||
* - check standby is attached to demotion candidate
|
* - check standby is attached to demotion candidate
|
||||||
* (compare primary_conninfo from recovery.conf)
|
* - check application_name in pg_stat_replication
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (local_node_record.upstream_node_id != remote_node_record.node_id)
|
if (local_node_record.upstream_node_id != remote_node_record.node_id)
|
||||||
@@ -1725,7 +1725,7 @@ do_standby_switchover(void)
|
|||||||
bool command_success;
|
bool command_success;
|
||||||
|
|
||||||
initPQExpBuffer(&remote_command_str);
|
initPQExpBuffer(&remote_command_str);
|
||||||
make_remote_repmgr_path(&remote_command_str);
|
make_remote_repmgr_path(&remote_command_str, &remote_node_record);
|
||||||
appendPQExpBuffer(&remote_command_str,
|
appendPQExpBuffer(&remote_command_str,
|
||||||
"node check --terse -LERROR --archiver --optformat");
|
"node check --terse -LERROR --archiver --optformat");
|
||||||
|
|
||||||
@@ -1848,112 +1848,6 @@ do_standby_switchover(void)
|
|||||||
|
|
||||||
PQfinish(remote_conn);
|
PQfinish(remote_conn);
|
||||||
|
|
||||||
/* Determine the remote's configuration file location */
|
|
||||||
/* -------------------------------------------------- */
|
|
||||||
|
|
||||||
/* Remote configuration file provided - check it exists */
|
|
||||||
/* TODO have remote node verify config file "node status --config-file */
|
|
||||||
if (runtime_options.remote_config_file[0])
|
|
||||||
|
|
||||||
{
|
|
||||||
log_verbose(LOG_INFO, _("looking for file \"%s\" on remote server \"%s\""),
|
|
||||||
runtime_options.remote_config_file,
|
|
||||||
remote_host);
|
|
||||||
|
|
||||||
initPQExpBuffer(&remote_command_str);
|
|
||||||
appendPQExpBuffer(&remote_command_str, "ls ");
|
|
||||||
|
|
||||||
appendShellString(&remote_command_str, runtime_options.remote_config_file);
|
|
||||||
appendPQExpBuffer(&remote_command_str, " >/dev/null 2>&1 && echo 1 || echo 0");
|
|
||||||
|
|
||||||
initPQExpBuffer(&command_output);
|
|
||||||
|
|
||||||
(void)remote_command(
|
|
||||||
remote_host,
|
|
||||||
runtime_options.remote_user,
|
|
||||||
remote_command_str.data,
|
|
||||||
&command_output);
|
|
||||||
|
|
||||||
termPQExpBuffer(&remote_command_str);
|
|
||||||
|
|
||||||
if (*command_output.data == '0')
|
|
||||||
{
|
|
||||||
log_error(_("unable to find the specified repmgr configuration file on remote server"));
|
|
||||||
log_detail(_("remote configuration file is \"%s\""),
|
|
||||||
runtime_options.remote_config_file);
|
|
||||||
PQfinish(local_conn);
|
|
||||||
exit(ERR_BAD_CONFIG);
|
|
||||||
}
|
|
||||||
|
|
||||||
log_verbose(LOG_INFO, _("remote configuration file \"%s\" found on remote server"),
|
|
||||||
runtime_options.remote_config_file);
|
|
||||||
|
|
||||||
termPQExpBuffer(&command_output);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
* No remote configuration file provided - check some default locations:
|
|
||||||
* - path of configuration file for this repmgr
|
|
||||||
* - /etc/repmgr.conf
|
|
||||||
*/
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
bool remote_config_file_found = false;
|
|
||||||
|
|
||||||
const char *config_paths[] = {
|
|
||||||
runtime_options.config_file,
|
|
||||||
"/etc/repmgr.conf",
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
log_verbose(LOG_INFO, _("no remote configuration file provided - checking default locations"));
|
|
||||||
|
|
||||||
for (i = 0; config_paths[i] && remote_config_file_found == false; ++i)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Don't attempt to check for an empty filename - this might be the case
|
|
||||||
* if no local configuration file was found.
|
|
||||||
*/
|
|
||||||
if (!strlen(config_paths[i]))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
log_verbose(LOG_INFO, _("checking \"%s\"\n"), config_paths[i]);
|
|
||||||
|
|
||||||
initPQExpBuffer(&remote_command_str);
|
|
||||||
appendPQExpBuffer(&remote_command_str, "ls ");
|
|
||||||
|
|
||||||
appendShellString(&remote_command_str, config_paths[i]);
|
|
||||||
appendPQExpBuffer(&remote_command_str, " >/dev/null 2>&1 && echo 1 || echo 0");
|
|
||||||
|
|
||||||
initPQExpBuffer(&command_output);
|
|
||||||
|
|
||||||
(void)remote_command(
|
|
||||||
remote_host,
|
|
||||||
runtime_options.remote_user,
|
|
||||||
remote_command_str.data,
|
|
||||||
&command_output);
|
|
||||||
|
|
||||||
termPQExpBuffer(&remote_command_str);
|
|
||||||
|
|
||||||
if (*command_output.data == '1')
|
|
||||||
{
|
|
||||||
strncpy(runtime_options.remote_config_file, config_paths[i], MAXLEN);
|
|
||||||
log_verbose(LOG_INFO, _("configuration file \"%s\" found on remote server"),
|
|
||||||
runtime_options.remote_config_file);
|
|
||||||
remote_config_file_found = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
termPQExpBuffer(&command_output);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (remote_config_file_found == false)
|
|
||||||
{
|
|
||||||
log_error(_("no remote configuration file supplied or found in a default location - terminating"));
|
|
||||||
log_hint(_("specify the remote configuration file with -C/--remote-config-file"));
|
|
||||||
PQfinish(local_conn);
|
|
||||||
exit(ERR_BAD_CONFIG);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If --siblings-follow specified, get list and check they're reachable
|
* If --siblings-follow specified, get list and check they're reachable
|
||||||
@@ -2049,7 +1943,7 @@ do_standby_switchover(void)
|
|||||||
initPQExpBuffer(&remote_command_str);
|
initPQExpBuffer(&remote_command_str);
|
||||||
initPQExpBuffer(&command_output);
|
initPQExpBuffer(&command_output);
|
||||||
|
|
||||||
make_remote_repmgr_path(&remote_command_str);
|
make_remote_repmgr_path(&remote_command_str, &remote_node_record);
|
||||||
|
|
||||||
|
|
||||||
if (runtime_options.dry_run == true)
|
if (runtime_options.dry_run == true)
|
||||||
@@ -2117,7 +2011,7 @@ do_standby_switchover(void)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
initPQExpBuffer(&remote_command_str);
|
initPQExpBuffer(&remote_command_str);
|
||||||
make_remote_repmgr_path(&remote_command_str);
|
make_remote_repmgr_path(&remote_command_str, &remote_node_record);
|
||||||
appendPQExpBuffer(&remote_command_str,
|
appendPQExpBuffer(&remote_command_str,
|
||||||
"node status --is-shutdown");
|
"node status --is-shutdown");
|
||||||
|
|
||||||
@@ -2232,7 +2126,7 @@ do_standby_switchover(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
initPQExpBuffer(&remote_command_str);
|
initPQExpBuffer(&remote_command_str);
|
||||||
make_remote_repmgr_path(&remote_command_str);
|
make_remote_repmgr_path(&remote_command_str, &remote_node_record);
|
||||||
|
|
||||||
appendPQExpBuffer(&remote_command_str,
|
appendPQExpBuffer(&remote_command_str,
|
||||||
"%s-d \\'%s\\' node rejoin",
|
"%s-d \\'%s\\' node rejoin",
|
||||||
@@ -2260,7 +2154,6 @@ do_standby_switchover(void)
|
|||||||
true,
|
true,
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
PQfinish(local_conn);
|
|
||||||
|
|
||||||
|
|
||||||
/* clean up remote node */
|
/* clean up remote node */
|
||||||
@@ -2305,21 +2198,25 @@ do_standby_switchover(void)
|
|||||||
for (cell = sibling_nodes.head; cell; cell = cell->next)
|
for (cell = sibling_nodes.head; cell; cell = cell->next)
|
||||||
{
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
log_debug("XXX %s", cell->node_info->node_name);
|
t_node_info sibling_node_record = T_NODE_INFO_INITIALIZER;
|
||||||
|
|
||||||
/* skip nodes previously determined as unreachable */
|
/* skip nodes previously determined as unreachable */
|
||||||
if (cell->node_info->reachable == false)
|
if (cell->node_info->reachable == false)
|
||||||
{
|
|
||||||
log_debug(" XXX unreachable!");
|
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
|
record_status = get_node_record(local_conn,
|
||||||
|
cell->node_info->node_id,
|
||||||
|
&sibling_node_record);
|
||||||
|
|
||||||
initPQExpBuffer(&remote_command_str);
|
initPQExpBuffer(&remote_command_str);
|
||||||
make_remote_repmgr_path(&remote_command_str);
|
make_remote_repmgr_path(&remote_command_str, &sibling_node_record);
|
||||||
|
|
||||||
appendPQExpBuffer(&remote_command_str,
|
appendPQExpBuffer(&remote_command_str,
|
||||||
"standby follow");
|
"standby follow");
|
||||||
get_conninfo_value(cell->node_info->conninfo, "host", host);
|
get_conninfo_value(cell->node_info->conninfo, "host", host);
|
||||||
log_debug("executing:\n \"%s\"", remote_command_str.data);
|
log_debug("executing:\n \"%s\"", remote_command_str.data);
|
||||||
|
|
||||||
r = remote_command(
|
r = remote_command(
|
||||||
host,
|
host,
|
||||||
runtime_options.remote_user,
|
runtime_options.remote_user,
|
||||||
@@ -2339,6 +2236,9 @@ do_standby_switchover(void)
|
|||||||
log_info(_("STANDBY FOLLOW"));
|
log_info(_("STANDBY FOLLOW"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PQfinish(local_conn);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,6 @@ typedef struct
|
|||||||
int wait_register_sync_seconds;
|
int wait_register_sync_seconds;
|
||||||
|
|
||||||
/* "standby switchover" options */
|
/* "standby switchover" options */
|
||||||
char remote_config_file[MAXPGPATH];
|
|
||||||
bool always_promote;
|
bool always_promote;
|
||||||
bool force_rewind;
|
bool force_rewind;
|
||||||
bool siblings_follow;
|
bool siblings_follow;
|
||||||
@@ -135,7 +134,7 @@ typedef struct
|
|||||||
/* "standby register" options */ \
|
/* "standby register" options */ \
|
||||||
false, 0, \
|
false, 0, \
|
||||||
/* "standby switchover" options */ \
|
/* "standby switchover" options */ \
|
||||||
"", false, false, false, \
|
false, false, false, \
|
||||||
/* "node status" options */ \
|
/* "node status" options */ \
|
||||||
false, \
|
false, \
|
||||||
/* "node check" options */ \
|
/* "node check" options */ \
|
||||||
@@ -208,7 +207,7 @@ extern void get_superuser_connection(PGconn **conn, PGconn **superuser_conn, PGc
|
|||||||
|
|
||||||
extern bool remote_command(const char *host, const char *user, const char *command, PQExpBufferData *outputbuf);
|
extern bool remote_command(const char *host, const char *user, const char *command, PQExpBufferData *outputbuf);
|
||||||
|
|
||||||
extern void make_remote_repmgr_path(PQExpBufferData *outputbuf);
|
extern void make_remote_repmgr_path(PQExpBufferData *outputbuf, t_node_info *remote_node_record);
|
||||||
|
|
||||||
/* server control functions */
|
/* server control functions */
|
||||||
extern void get_server_action(t_server_action action, char *script, char *data_dir);
|
extern void get_server_action(t_server_action action, char *script, char *data_dir);
|
||||||
|
|||||||
@@ -401,11 +401,6 @@ main(int argc, char **argv)
|
|||||||
/* "standby switchover" options *
|
/* "standby switchover" options *
|
||||||
* ---------------------------- */
|
* ---------------------------- */
|
||||||
|
|
||||||
/* -C/--remote-config-file */
|
|
||||||
case 'C':
|
|
||||||
strncpy(runtime_options.remote_config_file, optarg, MAXPGPATH);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case OPT_ALWAYS_PROMOTE:
|
case OPT_ALWAYS_PROMOTE:
|
||||||
runtime_options.always_promote = true;
|
runtime_options.always_promote = true;
|
||||||
break;
|
break;
|
||||||
@@ -548,6 +543,13 @@ main(int argc, char **argv)
|
|||||||
item_list_append(&cli_warnings,
|
item_list_append(&cli_warnings,
|
||||||
_("--no-conninfo-password is deprecated; pasuse --use-recovery-conninfo-password to explicitly set a password"));
|
_("--no-conninfo-password is deprecated; pasuse --use-recovery-conninfo-password to explicitly set a password"));
|
||||||
break;
|
break;
|
||||||
|
/* -C/--remote-config-file */
|
||||||
|
case 'C':
|
||||||
|
item_list_append(&cli_warnings,
|
||||||
|
_("--remote-config-file is no longer required"));
|
||||||
|
break;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2684,16 +2686,13 @@ remote_command(const char *host, const char *user, const char *command, PQExpBuf
|
|||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
make_remote_repmgr_path(PQExpBufferData *output_buf)
|
make_remote_repmgr_path(PQExpBufferData *output_buf, t_node_info *remote_node_record)
|
||||||
{
|
{
|
||||||
appendPQExpBuffer(output_buf,
|
appendPQExpBuffer(output_buf,
|
||||||
"%s ", make_pg_path("repmgr"));
|
"%s -f %s ",
|
||||||
|
make_pg_path("repmgr"),
|
||||||
|
remote_node_record->config_file);
|
||||||
|
|
||||||
if (runtime_options.remote_config_file[0] != '\0')
|
|
||||||
{
|
|
||||||
appendPQExpBuffer(output_buf,
|
|
||||||
"-f %s ", runtime_options.remote_config_file);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user