Implement repmgr standby register command

This commit is contained in:
Ian Barwick
2016-08-03 13:06:18 +09:00
committed by Ian Barwick
parent 6b57d0e680
commit c26fd21351

View File

@@ -18,6 +18,7 @@
* STANDBY SWITCHOVER * STANDBY SWITCHOVER
* *
* WITNESS CREATE * WITNESS CREATE
* WITNESS REGISTER
* WITNESS UNREGISTER * WITNESS UNREGISTER
* *
* CLUSTER SHOW * CLUSTER SHOW
@@ -83,9 +84,10 @@
#define STANDBY_ARCHIVE_CONFIG 8 #define STANDBY_ARCHIVE_CONFIG 8
#define STANDBY_RESTORE_CONFIG 9 #define STANDBY_RESTORE_CONFIG 9
#define WITNESS_CREATE 10 #define WITNESS_CREATE 10
#define WITNESS_UNREGISTER 11 #define WITNESS_REGISTER 11
#define CLUSTER_SHOW 12 #define WITNESS_UNREGISTER 12
#define CLUSTER_CLEANUP 13 #define CLUSTER_SHOW 13
#define CLUSTER_CLEANUP 14
static int test_ssh_connection(char *host, char *remote_user); static int test_ssh_connection(char *host, char *remote_user);
@@ -134,6 +136,7 @@ static bool copy_file(const char *old_filename, const char *new_filename);
static bool read_backup_label(const char *local_data_directory, struct BackupLabel *out_backup_label); static bool read_backup_label(const char *local_data_directory, struct BackupLabel *out_backup_label);
static void param_set(const char *param, const char *value); static void param_set(const char *param, const char *value);
static void parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_options *backup_options); static void parse_pg_basebackup_options(const char *pg_basebackup_options, t_basebackup_options *backup_options);
/* Global variables */ /* Global variables */
@@ -605,7 +608,7 @@ main(int argc, char **argv)
* Now we need to obtain the action, this comes in one of these forms: * Now we need to obtain the action, this comes in one of these forms:
* { MASTER | PRIMARY } REGISTER | * { MASTER | PRIMARY } REGISTER |
* STANDBY {REGISTER | UNREGISTER | CLONE [node] | PROMOTE | FOLLOW [node] | SWITCHOVER | REWIND} | * STANDBY {REGISTER | UNREGISTER | CLONE [node] | PROMOTE | FOLLOW [node] | SWITCHOVER | REWIND} |
* WITNESS { CREATE | UNREGISTER } | * WITNESS { CREATE | REGISTER | UNREGISTER } |
* CLUSTER {SHOW | CLEANUP} * CLUSTER {SHOW | CLEANUP}
* *
* the node part is optional, if we receive it then we shouldn't have * the node part is optional, if we receive it then we shouldn't have
@@ -667,9 +670,10 @@ main(int argc, char **argv)
{ {
if (strcasecmp(server_cmd, "CREATE") == 0) if (strcasecmp(server_cmd, "CREATE") == 0)
action = WITNESS_CREATE; action = WITNESS_CREATE;
if (strcasecmp(server_cmd, "UNREGISTER") == 0) else if (strcasecmp(server_cmd, "REGISTER") == 0)
action = WITNESS_REGISTER;
else if (strcasecmp(server_cmd, "UNREGISTER") == 0)
action = WITNESS_UNREGISTER; action = WITNESS_UNREGISTER;
} }
} }
@@ -876,6 +880,9 @@ main(int argc, char **argv)
case WITNESS_CREATE: case WITNESS_CREATE:
do_witness_create(); do_witness_create();
break; break;
case WITNESS_REGISTER:
do_witness_register(NULL);
break;
case WITNESS_UNREGISTER: case WITNESS_UNREGISTER:
do_witness_unregister(); do_witness_unregister();
break; break;
@@ -3867,10 +3874,13 @@ do_witness_create(void)
get_conninfo_value(options.conninfo, "user", repmgr_user); get_conninfo_value(options.conninfo, "user", repmgr_user);
get_conninfo_value(options.conninfo, "dbname", repmgr_db); get_conninfo_value(options.conninfo, "dbname", repmgr_db);
/* We need to connect to check configuration and copy it */ param_set("user", repmgr_user);
masterconn = establish_db_connection_by_params((const char**)param_keywords, (const char**)param_values, true); param_set("dbname", repmgr_db);
if (!masterconn) /* We need to connect to check configuration and copy it */
masterconn = establish_db_connection_by_params((const char**)param_keywords, (const char**)param_values, false);
if (PQstatus(masterconn) != CONNECTION_OK)
{ {
/* No event logging possible here as we can't connect to the master */ /* No event logging possible here as we can't connect to the master */
log_err(_("unable to connect to master\n")); log_err(_("unable to connect to master\n"));
@@ -4202,12 +4212,15 @@ do_witness_register(PGconn *masterconn)
get_conninfo_value(options.conninfo, "user", repmgr_user); get_conninfo_value(options.conninfo, "user", repmgr_user);
get_conninfo_value(options.conninfo, "dbname", repmgr_db); get_conninfo_value(options.conninfo, "dbname", repmgr_db);
param_set("user", repmgr_user);
param_set("dbname", repmgr_db);
/* masterconn will only be set when called from do_witness_create() */ /* masterconn will only be set when called from do_witness_create() */
if (masterconn == NULL) if (masterconn == NULL)
{ {
masterconn = establish_db_connection_by_params((const char**)param_keywords, (const char**)param_values, true); masterconn = establish_db_connection_by_params((const char**)param_keywords, (const char**)param_values, false);
if (!masterconn) if (PQstatus(masterconn) != CONNECTION_OK)
{ {
/* No event logging possible here as we can't connect to the master */ /* No event logging possible here as we can't connect to the master */
log_err(_("unable to connect to master\n")); log_err(_("unable to connect to master\n"));
@@ -6034,7 +6047,7 @@ param_set(const char *param, const char *value)
int value_len = strlen(value) + 1; int value_len = strlen(value) + 1;
/* /*
* Scan array to see if the parameter is already set - if so replace it * Scan array to see if the parameter is already set - if not, replace it
*/ */
for (c = 0; c <= param_count && param_keywords[c] != NULL; c++) for (c = 0; c <= param_count && param_keywords[c] != NULL; c++)
{ {
@@ -6045,6 +6058,7 @@ param_set(const char *param, const char *value)
param_values[c] = pg_malloc0(value_len); param_values[c] = pg_malloc0(value_len);
strncpy(param_values[c], value, value_len); strncpy(param_values[c], value, value_len);
return; return;
} }
} }