aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2021-01-05 16:18:01 -0500
committerTom Lane <tgl@sss.pgh.pa.us>2021-01-05 16:18:05 -0500
commitbf8a662c9afad6fd07b42cdc5e71416c51f75d31 (patch)
tree6b2d6c2e185a0dd4897101935d69ef3d5b3969cd /src
parent47b2ed1d06c1218eee8869c8eca8bf002b9d43a6 (diff)
downloadpostgresql-bf8a662c9afad6fd07b42cdc5e71416c51f75d31.tar.gz
postgresql-bf8a662c9afad6fd07b42cdc5e71416c51f75d31.zip
Introduce a new GUC_REPORT setting "in_hot_standby".
Aside from being queriable via SHOW, this value is sent to the client immediately at session startup, and again later on if the server gets promoted to primary during the session. The immediate report will be used in an upcoming patch to avoid an extra round trip when trying to connect to a primary server. Haribabu Kommi, Greg Nancarrow, Tom Lane; reviewed at various times by Laurenz Albe, Takayuki Tsunakawa, Peter Smith. Discussion: https://postgr.es/m/CAF3+xM+8-ztOkaV9gHiJ3wfgENTq97QcjXQt+rbFQ6F7oNzt9A@mail.gmail.com
Diffstat (limited to 'src')
-rwxr-xr-xsrc/backend/utils/misc/check_guc2
-rw-r--r--src/backend/utils/misc/guc.c50
2 files changed, 51 insertions, 1 deletions
diff --git a/src/backend/utils/misc/check_guc b/src/backend/utils/misc/check_guc
index 416a0875b6c..b171ef0e4ff 100755
--- a/src/backend/utils/misc/check_guc
+++ b/src/backend/utils/misc/check_guc
@@ -16,7 +16,7 @@
## if an option is valid but shows up in only one file (guc.c but not
## postgresql.conf.sample), it should be listed here so that it
## can be ignored
-INTENTIONALLY_NOT_INCLUDED="debug_deadlocks \
+INTENTIONALLY_NOT_INCLUDED="debug_deadlocks in_hot_standby \
is_superuser lc_collate lc_ctype lc_messages lc_monetary lc_numeric lc_time \
pre_auth_delay role seed server_encoding server_version server_version_num \
session_authorization trace_lock_oidmin trace_lock_table trace_locks trace_lwlocks \
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 2779da8a693..383b7d0d710 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -209,6 +209,7 @@ static bool check_cluster_name(char **newval, void **extra, GucSource source);
static const char *show_unix_socket_permissions(void);
static const char *show_log_file_mode(void);
static const char *show_data_directory_mode(void);
+static const char *show_in_hot_standby(void);
static bool check_backtrace_functions(char **newval, void **extra, GucSource source);
static void assign_backtrace_functions(const char *newval, void *extra);
static bool check_recovery_target_timeline(char **newval, void **extra, GucSource source);
@@ -610,6 +611,7 @@ static int wal_block_size;
static bool data_checksums;
static bool integer_datetimes;
static bool assert_enabled;
+static bool in_hot_standby;
static char *recovery_target_timeline_string;
static char *recovery_target_string;
static char *recovery_target_xid_string;
@@ -1845,6 +1847,17 @@ static struct config_bool ConfigureNamesBool[] =
},
{
+ {"in_hot_standby", PGC_INTERNAL, PRESET_OPTIONS,
+ gettext_noop("Shows whether hot standby is currently active."),
+ NULL,
+ GUC_REPORT | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE
+ },
+ &in_hot_standby,
+ false,
+ NULL, NULL, show_in_hot_standby
+ },
+
+ {
{"allow_system_table_mods", PGC_SUSET, DEVELOPER_OPTIONS,
gettext_noop("Allows modifications of the structure of system tables."),
NULL,
@@ -6248,6 +6261,14 @@ BeginReportingGUCOptions(void)
reporting_enabled = true;
+ /*
+ * Hack for in_hot_standby: initialize with the value we're about to send.
+ * (This could be out of date by the time we actually send it, in which
+ * case the next ReportChangedGUCOptions call will send a duplicate
+ * report.)
+ */
+ in_hot_standby = RecoveryInProgress();
+
/* Transmit initial values of interesting variables */
for (i = 0; i < num_guc_variables; i++)
{
@@ -6280,6 +6301,23 @@ ReportChangedGUCOptions(void)
if (!reporting_enabled)
return;
+ /*
+ * Since in_hot_standby isn't actually changed by normal GUC actions, we
+ * need a hack to check whether a new value needs to be reported to the
+ * client. For speed, we rely on the assumption that it can never
+ * transition from false to true.
+ */
+ if (in_hot_standby && !RecoveryInProgress())
+ {
+ struct config_generic *record;
+
+ record = find_option("in_hot_standby", false, ERROR);
+ Assert(record != NULL);
+ record->status |= GUC_NEEDS_REPORT;
+ report_needed = true;
+ in_hot_standby = false;
+ }
+
/* Quick exit if no values have been changed */
if (!report_needed)
return;
@@ -11773,6 +11811,18 @@ show_data_directory_mode(void)
return buf;
}
+static const char *
+show_in_hot_standby(void)
+{
+ /*
+ * We display the actual state based on shared memory, so that this GUC
+ * reports up-to-date state if examined intra-query. The underlying
+ * variable in_hot_standby changes only when we transmit a new value to
+ * the client.
+ */
+ return RecoveryInProgress() ? "on" : "off";
+}
+
/*
* We split the input string, where commas separate function names
* and certain whitespace chars are ignored, into a \0-separated (and