diff --git a/dbutils.c b/dbutils.c index 435cae33..6e638382 100644 --- a/dbutils.c +++ b/dbutils.c @@ -3265,14 +3265,14 @@ _create_event(PGconn *conn, t_configuration_options *options, int node_id, char } break; case 'p': - /* %p: former primary id ("repmgr standby switchover") */ + /* %p: primary id ("standby_switchover": former primary id) */ src_ptr++; - if (event_info->former_primary_id != UNKNOWN_NODE_ID) + if (event_info->node_id != UNKNOWN_NODE_ID) { PQExpBufferData node_id; initPQExpBuffer(&node_id); appendPQExpBuffer(&node_id, - "%i", event_info->former_primary_id); + "%i", event_info->node_id); strlcpy(dst_ptr, node_id.data, end_ptr - dst_ptr); dst_ptr += strlen(dst_ptr); termPQExpBuffer(&node_id); diff --git a/dbutils.h b/dbutils.h index 9e4cd4d0..15b05b3d 100644 --- a/dbutils.h +++ b/dbutils.h @@ -175,7 +175,7 @@ typedef struct s_event_info { char *node_name; char *conninfo_str; - int former_primary_id; + int node_id; } t_event_info; #define T_EVENT_INFO_INITIALIZER { \ diff --git a/doc/event-notifications.sgml b/doc/event-notifications.sgml index fe81710a..e28a206b 100644 --- a/doc/event-notifications.sgml +++ b/doc/event-notifications.sgml @@ -37,7 +37,7 @@ repmgr.conf. - This parameter accepts the following format placeholders: + The following format placeholders are provided for all event notifications: @@ -84,18 +84,8 @@ - - - - - - - node ID of the demoted primary ( only) - - - - + The values provided for %t and %d will probably contain spaces, so should be quoted in the provided command @@ -104,34 +94,60 @@ event_notification_command='/path/to/some/script %n %e %s "%t" "%d"' + - Additionally the following format placeholders are available for the event - type bdr_failover and optionally bdr_recovery: + The following parameters are provided for a subset of event notifications: + + + + + + node ID of the current primary ( and ) + + + node ID of the demoted primary ( only) + + + - conninfo string of the next available node + conninfo string of the primary node + ( and ) + + + conninfo string of the next available node + (bdr_failover and bdr_recovery) + - name of the next available node + name of the current primary node ( and ) + + + name of the next available node (bdr_failover and bdr_recovery) + + - These should always be quoted. + The values provided for %c and %a + will probably contain spaces, so should always be quoted. + By default, all notification types will be passed to the designated script; - the notification types can be filtered to explicitly named ones: + the notification types can be filtered to explicitly named ones using the + event_notifications parameter: @@ -219,6 +235,7 @@ + Note that under some circumstances (e.g. when no replication cluster primary could be located), it will not be possible to write an entry into the diff --git a/doc/repmgr-standby-follow.sgml b/doc/repmgr-standby-follow.sgml index 1bee915b..ac1a8f8a 100644 --- a/doc/repmgr-standby-follow.sgml +++ b/doc/repmgr-standby-follow.sgml @@ -87,9 +87,14 @@ A standby_follow event notification will be generated. + + If provided, &repmgr; will subsitute the placeholders %p with the node ID of the primary + being followed, %c with its conninfo string, and + %a with its node name. + - + See also diff --git a/doc/repmgr-standby-register.sgml b/doc/repmgr-standby-register.sgml index 96a3649a..0f120596 100644 --- a/doc/repmgr-standby-register.sgml +++ b/doc/repmgr-standby-register.sgml @@ -105,6 +105,12 @@ standby. + + If provided, &repmgr; will subsitute the placeholders %p with the node ID of the + primary node, %c with its conninfo string, and + %a with its node name. + + diff --git a/repmgr-action-standby.c b/repmgr-action-standby.c index 3dae11dc..4371020b 100644 --- a/repmgr-action-standby.c +++ b/repmgr-action-standby.c @@ -779,6 +779,11 @@ do_standby_register(void) PQExpBufferData details; + /* so we can pass info about the primary to event notification scripts */ + t_event_info event_info = T_EVENT_INFO_INITIALIZER; + t_node_info primary_node_record = T_NODE_INFO_INITIALIZER; + int primary_node_id = UNKNOWN_NODE_ID; + log_info(_("connecting to local node \"%s\" (ID: %i)"), config_file_options.node_name, config_file_options.node_id); @@ -863,7 +868,7 @@ do_standby_register(void) /* Normal case - we can connect to the local node */ if (PQstatus(conn) == CONNECTION_OK) { - primary_conn = get_primary_connection(conn, NULL, NULL); + primary_conn = get_primary_connection(conn, &primary_node_id, NULL); } /* @@ -887,6 +892,16 @@ do_standby_register(void) exit(ERR_BAD_CONFIG); } + /* + * Populate "event_info" with info about the primary for event notifications + */ + record_status = get_node_record(primary_conn, + primary_node_id, + &primary_node_record); + event_info.node_id = primary_node_id; + event_info.node_name = primary_node_record.node_name; + event_info.conninfo_str = primary_node_record.conninfo; + /* * Verify that standby and primary are supported and compatible server * versions @@ -1141,12 +1156,14 @@ do_standby_register(void) &details, " (-F/--force option was used)"); - create_event_notification(primary_conn, - &config_file_options, - config_file_options.node_id, - "standby_register", - false, - details.data); + create_event_notification_extended( + primary_conn, + &config_file_options, + config_file_options.node_id, + "standby_register", + false, + details.data, + &event_info); termPQExpBuffer(&details); PQfinish(primary_conn); @@ -1166,12 +1183,14 @@ do_standby_register(void) /* Log the event */ - create_event_notification(primary_conn, - &config_file_options, - config_file_options.node_id, - "standby_register", - true, - details.data); + create_event_notification_extended( + primary_conn, + &config_file_options, + config_file_options.node_id, + "standby_register", + true, + details.data, + &event_info); termPQExpBuffer(&details); @@ -1266,12 +1285,14 @@ do_standby_register(void) timer); } - create_event_notification(primary_conn, - &config_file_options, - config_file_options.node_id, - "standby_register_sync", - sync_ok, - details.data); + create_event_notification_extended( + primary_conn, + &config_file_options, + config_file_options.node_id, + "standby_register_sync", + sync_ok, + details.data, + &event_info); if (sync_ok == false) { @@ -1605,9 +1626,11 @@ do_standby_follow(void) PGconn *local_conn = NULL; PGconn *primary_conn = NULL; - int primary_id = UNKNOWN_NODE_ID; + int primary_node_id = UNKNOWN_NODE_ID; t_node_info primary_node_record = T_NODE_INFO_INITIALIZER; RecordStatus record_status = RECORD_NOT_FOUND; + /* so we can pass info about the primary to event notification scripts */ + t_event_info event_info = T_EVENT_INFO_INITIALIZER; int timer = 0; int server_version_num = UNKNOWN_SERVER_VERSION_NUM; @@ -1646,7 +1669,7 @@ do_standby_follow(void) for (timer = 0; timer < config_file_options.primary_follow_timeout; timer++) { primary_conn = get_primary_connection_quiet(local_conn, - &primary_id, + &primary_node_id, NULL); if (PQstatus(primary_conn) == CONNECTION_OK || runtime_options.wait == false) { @@ -1673,14 +1696,14 @@ do_standby_follow(void) if (runtime_options.dry_run == true) { - log_info(_("connected to node %i, checking for current primary"), primary_id); + log_info(_("connected to node %i, checking for current primary"), primary_node_id); } else { - log_verbose(LOG_INFO, _("connected to node %i, checking for current primary"), primary_id); + log_verbose(LOG_INFO, _("connected to node %i, checking for current primary"), primary_node_id); } - record_status = get_node_record(primary_conn, primary_id, &primary_node_record); + record_status = get_node_record(primary_conn, primary_node_id, &primary_node_record); if (record_status != RECORD_FOUND) { @@ -1690,17 +1713,25 @@ do_standby_follow(void) exit(ERR_BAD_CONFIG); } + /* + * Populate "event_info" with info about the primary for event notifications + */ + event_info.node_id = primary_node_id; + event_info.node_name = primary_node_record.node_name; + event_info.conninfo_str = primary_node_record.conninfo; + + if (runtime_options.dry_run == true) { log_info(_("primary node is \"%s\" (ID: %i)"), primary_node_record.node_name, - primary_id); + primary_node_id); } else { log_verbose(LOG_INFO, ("primary node is \"%s\" (ID: %i)"), primary_node_record.node_name, - primary_id); + primary_node_id); } /* if replication slots in use, check at least one free slot is available */ @@ -1791,7 +1822,6 @@ do_standby_follow(void) exit(SUCCESS); } - initPQExpBuffer(&follow_output); success = do_standby_follow_internal(primary_conn, @@ -1799,12 +1829,14 @@ do_standby_follow(void) &follow_output, &follow_error_code); - create_event_notification(primary_conn, - &config_file_options, - config_file_options.node_id, - "standby_follow", - success, - follow_output.data); + create_event_notification_extended( + primary_conn, + &config_file_options, + config_file_options.node_id, + "standby_follow", + success, + follow_output.data, + &event_info); PQfinish(primary_conn); @@ -2244,7 +2276,7 @@ do_standby_switchover(void) log_verbose(LOG_DEBUG, "remote node name is \"%s\"", remote_node_record.node_name); /* this will fill the %p event notification parameter */ - event_info.former_primary_id = remote_node_record.node_id; + event_info.node_id = remote_node_record.node_id; /* * If --force-rewind specified, check pg_rewind can be used, and