From 0d226867b45b014eda2977fc8de2170cc8426a72 Mon Sep 17 00:00:00 2001 From: Ian Barwick Date: Thu, 6 Jul 2017 01:17:00 +0900 Subject: [PATCH] Add "location" column --- config.c | 4 ++++ config.h | 3 ++- dbutils.c | 33 ++++++++++++++++++--------------- dbutils.h | 6 ++++-- doc/changes-in-repmgr4.md | 1 + repmgr--4.0.sql | 1 + repmgr-action-primary.c | 3 ++- repmgr-action-standby.c | 26 +++++++++++++++----------- repmgr.h | 1 + 9 files changed, 48 insertions(+), 30 deletions(-) diff --git a/config.c b/config.c index 15ce3eff..f87018a8 100644 --- a/config.c +++ b/config.c @@ -235,6 +235,8 @@ _parse_config(t_configuration_options *options, ItemList *error_list, ItemList * * ---------------- */ options->failover_mode = FAILOVER_MANUAL; options->priority = DEFAULT_PRIORITY; + memset(options->location, 0, sizeof(options->location)); + strncpy(options->location, DEFAULT_LOCATION, MAXLEN); memset(options->promote_command, 0, sizeof(options->promote_command)); memset(options->follow_command, 0, sizeof(options->follow_command)); options->monitor_interval_secs = 2; @@ -399,6 +401,8 @@ _parse_config(t_configuration_options *options, ItemList *error_list, ItemList * } else if (strcmp(name, "priority") == 0) options->priority = repmgr_atoi(value, name, error_list, 0); + else if (strcmp(name, "location") == 0) + strncpy(options->location, value, MAXLEN); else if (strcmp(name, "promote_command") == 0) strncpy(options->promote_command, value, MAXLEN); else if (strcmp(name, "follow_command") == 0) diff --git a/config.h b/config.h index e54d0e58..efa3ebd7 100644 --- a/config.h +++ b/config.h @@ -73,6 +73,7 @@ typedef struct /* repmgrd settings */ failover_mode_opt failover_mode; + char location[MAXLEN]; int priority; char promote_command[MAXLEN]; char follow_command[MAXLEN]; @@ -123,7 +124,7 @@ typedef struct /* standby clone settings */ \ false, "", "", "", "", { NULL, NULL }, \ /* repmgrd settings */ \ - FAILOVER_MANUAL, DEFAULT_PRIORITY, "", "", 2, 60, 6, 10, 300, false, \ + FAILOVER_MANUAL, DEFAULT_LOCATION, DEFAULT_PRIORITY, "", "", 2, 60, 6, 10, 300, false, \ /* witness settings */ \ 30, \ /* service settings */ \ diff --git a/dbutils.c b/dbutils.c index 04687758..9a21ea49 100644 --- a/dbutils.c +++ b/dbutils.c @@ -1204,8 +1204,9 @@ _populate_node_record(PGresult *res, t_node_info *node_info, int row) strncpy(node_info->conninfo, PQgetvalue(res, row, 4), MAXLEN); strncpy(node_info->repluser, PQgetvalue(res, row, 5), MAXLEN); strncpy(node_info->slot_name, PQgetvalue(res, row, 6), MAXLEN); - node_info->priority = atoi(PQgetvalue(res, row, 7)); - node_info->active = atobool(PQgetvalue(res, row, 8)); + strncpy(node_info->location, PQgetvalue(res, row, 7), MAXLEN); + node_info->priority = atoi(PQgetvalue(res, row, 8)); + node_info->active = atobool(PQgetvalue(res, row, 9)); /* Set remaining struct fields with default values */ node_info->is_ready = false; @@ -1267,7 +1268,7 @@ get_node_record(PGconn *conn, int node_id, t_node_info *node_info) initPQExpBuffer(&query); appendPQExpBuffer(&query, - "SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, priority, active" + "SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, location, priority, active" " FROM repmgr.nodes " " WHERE node_id = %i", node_id); @@ -1295,7 +1296,7 @@ get_node_record_by_name(PGconn *conn, const char *node_name, t_node_info *node_i initPQExpBuffer(&query); appendPQExpBuffer(&query, - "SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, priority, active" + "SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, location, priority, active" " FROM repmgr.nodes " " WHERE node_name = '%s' ", node_name); @@ -1405,7 +1406,7 @@ get_downstream_node_records(PGconn *conn, int node_id, NodeInfoList *node_list) initPQExpBuffer(&query); appendPQExpBuffer(&query, - " SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, priority, active" + " SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, location, priority, active" " FROM repmgr.nodes " " WHERE upstream_node_id = %i " "ORDER BY node_id ", @@ -1432,7 +1433,7 @@ get_active_sibling_node_records(PGconn *conn, int node_id, int upstream_node_id, initPQExpBuffer(&query); appendPQExpBuffer(&query, - " SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, priority, active" + " SELECT node_id, type, upstream_node_id, node_name, conninfo, repluser, slot_name, location, priority, active" " FROM repmgr.nodes " " WHERE upstream_node_id = %i " " AND node_id != %i " @@ -1484,7 +1485,7 @@ _create_update_node_record(PGconn *conn, char *action, t_node_info *node_info) char slot_name[MAXLEN]; char *slot_name_ptr = NULL; - int param_count = 9; + int param_count = 10; const char *param_values[param_count]; PGresult *res; @@ -1518,9 +1519,10 @@ _create_update_node_record(PGconn *conn, char *action, t_node_info *node_info) param_values[3] = node_info->conninfo; param_values[4] = node_info->repluser; param_values[5] = slot_name_ptr; - param_values[6] = priority; - param_values[7] = node_info->active == true ? "TRUE" : "FALSE"; - param_values[8] = node_id; + param_values[6] = node_info->location; + param_values[7] = priority; + param_values[8] = node_info->active == true ? "TRUE" : "FALSE"; + param_values[9] = node_id; initPQExpBuffer(&query); @@ -1530,8 +1532,8 @@ _create_update_node_record(PGconn *conn, char *action, t_node_info *node_info) "INSERT INTO repmgr.nodes " " (node_id, type, upstream_node_id, " " node_name, conninfo, repluser, slot_name, " - " priority, active) " - "VALUES ($9, $1, $2, $3, $4, $5, $6, $7, $8) "); + " location, priority, active) " + "VALUES ($10, $1, $2, $3, $4, $5, $6, $7, $8, $9) "); } else { @@ -1543,9 +1545,10 @@ _create_update_node_record(PGconn *conn, char *action, t_node_info *node_info) " conninfo = $4, " " repluser = $5, " " slot_name = $6, " - " priority = $7, " - " active = $8 " - " WHERE node_id = $9 "); + " location = $7, " + " priority = $8, " + " active = $9 " + " WHERE node_id = $10 "); } diff --git a/dbutils.h b/dbutils.h index 3a2aed47..3b1125e3 100644 --- a/dbutils.h +++ b/dbutils.h @@ -55,9 +55,10 @@ typedef struct s_node_info char node_name[MAXLEN]; char conninfo[MAXLEN]; char repluser[NAMEDATALEN]; - char slot_name[MAXLEN]; + char location[MAXLEN]; int priority; bool active; + char slot_name[MAXLEN]; /* used during failover to track node status */ bool is_ready; bool is_visible; @@ -73,9 +74,10 @@ typedef struct s_node_info "", \ "", \ "", \ - "", \ + DEFAULT_LOCATION, \ DEFAULT_PRIORITY, \ true, \ + "", \ false, \ false, \ InvalidXLogRecPtr, \ diff --git a/doc/changes-in-repmgr4.md b/doc/changes-in-repmgr4.md index c2fab9be..79b346b3 100644 --- a/doc/changes-in-repmgr4.md +++ b/doc/changes-in-repmgr4.md @@ -22,6 +22,7 @@ Changed command line options The value (defaults to the user in the conninfo string) will be stored in the repmgr metadata for use by standby clone/follow.. + ### repmgrd - `--monitoring-history` is deprecated and has been replaced by the diff --git a/repmgr--4.0.sql b/repmgr--4.0.sql index dcc7a0e3..eab65578 100644 --- a/repmgr--4.0.sql +++ b/repmgr--4.0.sql @@ -7,6 +7,7 @@ CREATE TABLE nodes ( active BOOLEAN NOT NULL DEFAULT TRUE, node_name TEXT NOT NULL, type TEXT NOT NULL CHECK (type IN('primary','standby','witness','bdr')), + location TEXT NOT NULL DEFAULT 'default', priority INT NOT NULL DEFAULT 100, conninfo TEXT NOT NULL, repluser VARCHAR(63) NOT NULL, diff --git a/repmgr-action-primary.c b/repmgr-action-primary.c index 6b12a1df..16f22f85 100644 --- a/repmgr-action-primary.c +++ b/repmgr-action-primary.c @@ -150,7 +150,7 @@ do_primary_register(void) if (config_file_options.replication_user[0] != '\0') { - strncpy(node_info.repluser, config_file_options.replication_user, MAXLEN); + strncpy(node_info.repluser, config_file_options.replication_user, NAMEDATALEN); } else { @@ -160,6 +160,7 @@ do_primary_register(void) if (repmgr_slot_name_ptr != NULL) strncpy(node_info.slot_name, repmgr_slot_name_ptr, MAXLEN); + strncpy(node_info.location, config_file_options.location, MAXLEN); node_info.priority = config_file_options.priority; initPQExpBuffer(&event_description); diff --git a/repmgr-action-standby.c b/repmgr-action-standby.c index 3e960bb3..6541eddc 100644 --- a/repmgr-action-standby.c +++ b/repmgr-action-standby.c @@ -781,13 +781,17 @@ do_standby_register(void) node_record.priority = config_file_options.priority; node_record.active = true; + strncpy(node_record.location, config_file_options.location, MAXLEN); + + printf("XXX %s %s\n", node_record.location, config_file_options.location); + strncpy(node_record.node_name, config_file_options.node_name, MAXLEN); strncpy(node_record.conninfo, config_file_options.conninfo, MAXLEN); if (config_file_options.replication_user[0] != '\0') { /* Replication user explicitly provided */ - strncpy(node_record.repluser, config_file_options.replication_user, MAXLEN); + strncpy(node_record.repluser, config_file_options.replication_user, NAMEDATALEN); } else { @@ -820,11 +824,11 @@ do_standby_register(void) /* XXX add event description */ create_event_notification(primary_conn, - &config_file_options, - config_file_options.node_id, - "standby_register", - false, - NULL); + &config_file_options, + config_file_options.node_id, + "standby_register", + false, + NULL); PQfinish(primary_conn); @@ -835,11 +839,11 @@ do_standby_register(void) /* Log the event */ create_event_notification(primary_conn, - &config_file_options, - config_file_options.node_id, - "standby_register", - true, - NULL); + &config_file_options, + config_file_options.node_id, + "standby_register", + true, + NULL); /* if --wait-sync option set, wait for the records to synchronise */ diff --git a/repmgr.h b/repmgr.h index d76f1123..bc5d114f 100644 --- a/repmgr.h +++ b/repmgr.h @@ -33,6 +33,7 @@ #define BDR_MONITORING_LOCAL 1 #define BDR_MONITORING_PRIORITY 2 +#define DEFAULT_LOCATION "default" #define DEFAULT_PRIORITY 100 #define FAILOVER_NODES_MAX_CHECK 50