From 5f9a56a9c0d73a221e55b2c02e006d3104f4937b Mon Sep 17 00:00:00 2001 From: Justin Pryzby Date: Tue, 19 Jul 2022 08:31:56 -0500 Subject: [PATCH 1/2] wip: add DYNAMIC_DEFAULT for settings which are vary by configure flags or platform or initdb --- doc/src/sgml/func.sgml | 4 ++++ src/backend/utils/misc/guc.c | 36 +++++++++++++++++++++++------------- src/include/utils/guc.h | 6 ++++-- 3 files changed, 31 insertions(+), 15 deletions(-) diff --git a/doc/src/sgml/func.sgml b/doc/src/sgml/func.sgml index e3e24e185a4..0fd6234eaf2 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -24977,6 +24977,10 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id')); an empty array if the GUC exists but there are no flags to show. Only the most useful flags are exposed, as of the following: + + DYNAMIC_DEFAULT: parameters whose default varies by + platform, or compile-time options, or initdb. + EXPLAIN: parameters included in EXPLAIN (SETTINGS) commands. diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 0328029d430..dbbadc5a475 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -1435,7 +1435,7 @@ static struct config_bool ConfigureNamesBool[] = {"debug_assertions", PGC_INTERNAL, PRESET_OPTIONS, gettext_noop("Shows whether the running server has assertion checks enabled."), NULL, - GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_DYNAMIC_DEFAULT }, &assert_enabled, #ifdef USE_ASSERT_CHECKING @@ -1611,7 +1611,8 @@ static struct config_bool ConfigureNamesBool[] = { {"update_process_title", PGC_SUSET, PROCESS_TITLE, gettext_noop("Updates the process title to show the active SQL command."), - gettext_noop("Enables updating of the process title every time a new SQL command is received by the server.") + gettext_noop("Enables updating of the process title every time a new SQL command is received by the server."), + GUC_DYNAMIC_DEFAULT }, &update_process_title, #ifdef WIN32 @@ -2362,6 +2363,7 @@ static struct config_int ConfigureNamesInt[] = gettext_noop("Sets the maximum number of concurrent connections."), NULL }, + &MaxConnections, 100, 1, MAX_BACKENDS, check_maxconnections, NULL, NULL @@ -2397,7 +2399,7 @@ static struct config_int ConfigureNamesInt[] = {"shared_buffers", PGC_POSTMASTER, RESOURCES_MEM, gettext_noop("Sets the number of shared memory buffers used by the server."), NULL, - GUC_UNIT_BLOCKS + GUC_UNIT_BLOCKS | GUC_DYNAMIC_DEFAULT }, &NBuffers, 16384, 16, INT_MAX / 2, @@ -3142,7 +3144,7 @@ static struct config_int ConfigureNamesInt[] = RESOURCES_ASYNCHRONOUS, gettext_noop("Number of simultaneous requests that can be handled efficiently by the disk subsystem."), NULL, - GUC_EXPLAIN + GUC_EXPLAIN|GUC_DYNAMIC_DEFAULT }, &effective_io_concurrency, #ifdef USE_PREFETCH @@ -3160,7 +3162,7 @@ static struct config_int ConfigureNamesInt[] = RESOURCES_ASYNCHRONOUS, gettext_noop("A variant of effective_io_concurrency that is used for maintenance work."), NULL, - GUC_EXPLAIN + GUC_EXPLAIN|GUC_DYNAMIC_DEFAULT }, &maintenance_io_concurrency, #ifdef USE_PREFETCH @@ -3327,9 +3329,11 @@ static struct config_int ConfigureNamesInt[] = gettext_noop("Shows the size of write ahead log segments."), NULL, GUC_UNIT_BYTE | GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_RUNTIME_COMPUTED + }, &wal_segment_size, DEFAULT_XLOG_SEG_SIZE, + WalSegMinSize, WalSegMaxSize, NULL, NULL, NULL @@ -3523,6 +3527,7 @@ static struct config_int ConfigureNamesInt[] = GUC_UNIT_BLOCKS | GUC_EXPLAIN, }, &effective_cache_size, + DEFAULT_EFFECTIVE_CACHE_SIZE, 1, INT_MAX, NULL, NULL, NULL }, @@ -3620,7 +3625,7 @@ static struct config_int ConfigureNamesInt[] = {"debug_discard_caches", PGC_SUSET, DEVELOPER_OPTIONS, gettext_noop("Aggressively flush system caches for debugging purposes."), NULL, - GUC_NOT_IN_SAMPLE + GUC_NOT_IN_SAMPLE | GUC_DYNAMIC_DEFAULT }, &debug_discard_caches, #ifdef DISCARD_CACHES_ENABLED @@ -4447,7 +4452,7 @@ static struct config_string ConfigureNamesString[] = {"unix_socket_directories", PGC_POSTMASTER, CONN_AUTH_SETTINGS, gettext_noop("Sets the directories where Unix-domain sockets will be created."), NULL, - GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY + GUC_LIST_INPUT | GUC_LIST_QUOTE | GUC_SUPERUSER_ONLY | GUC_DYNAMIC_DEFAULT }, &Unix_socket_directories, #ifdef HAVE_UNIX_SOCKETS @@ -4532,7 +4537,7 @@ static struct config_string ConfigureNamesString[] = {"ssl_library", PGC_INTERNAL, PRESET_OPTIONS, gettext_noop("Shows the name of the SSL library."), NULL, - GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE + GUC_NOT_IN_SAMPLE | GUC_DISALLOW_IN_FILE | GUC_DYNAMIC_DEFAULT }, &ssl_library, #ifdef USE_SSL @@ -4618,7 +4623,7 @@ static struct config_string ConfigureNamesString[] = {"ssl_ciphers", PGC_SIGHUP, CONN_AUTH_SSL, gettext_noop("Sets the list of allowed SSL ciphers."), NULL, - GUC_SUPERUSER_ONLY + GUC_SUPERUSER_ONLY | GUC_DYNAMIC_DEFAULT }, &SSLCipherSuites, #ifdef USE_OPENSSL @@ -4633,7 +4638,7 @@ static struct config_string ConfigureNamesString[] = {"ssl_ecdh_curve", PGC_SIGHUP, CONN_AUTH_SSL, gettext_noop("Sets the curve to use for ECDH."), NULL, - GUC_SUPERUSER_ONLY + GUC_SUPERUSER_ONLY | GUC_DYNAMIC_DEFAULT }, &SSLECDHCurve, #ifdef USE_SSL @@ -4871,7 +4876,8 @@ static struct config_enum ConfigureNamesEnum[] = { {"syslog_facility", PGC_SIGHUP, LOGGING_WHERE, gettext_noop("Sets the syslog \"facility\" to be used when syslog enabled."), - NULL + NULL, + GUC_DYNAMIC_DEFAULT }, &syslog_facility, #ifdef HAVE_SYSLOG @@ -4984,7 +4990,8 @@ static struct config_enum ConfigureNamesEnum[] = { {"dynamic_shared_memory_type", PGC_POSTMASTER, RESOURCES_MEM, gettext_noop("Selects the dynamic shared memory implementation used."), - NULL + NULL, + GUC_DYNAMIC_DEFAULT }, &dynamic_shared_memory_type, DEFAULT_DYNAMIC_SHARED_MEMORY_TYPE, dynamic_shared_memory_options, @@ -5008,6 +5015,7 @@ static struct config_enum ConfigureNamesEnum[] = }, &sync_method, DEFAULT_SYNC_METHOD, sync_method_options, + NULL, assign_xlog_sync_method, NULL }, @@ -9943,7 +9951,7 @@ GetConfigOptionByName(const char *name, const char **varname, bool missing_ok) Datum pg_settings_get_flags(PG_FUNCTION_ARGS) { -#define MAX_GUC_FLAGS 5 +#define MAX_GUC_FLAGS 6 char *varname = TextDatumGetCString(PG_GETARG_DATUM(0)); struct config_generic *record; int cnt = 0; @@ -9956,6 +9964,8 @@ pg_settings_get_flags(PG_FUNCTION_ARGS) if (record == NULL) PG_RETURN_NULL(); + if (record->flags & GUC_DYNAMIC_DEFAULT) + flags[cnt++] = CStringGetTextDatum("DYNAMIC_DEFAULT"); if (record->flags & GUC_EXPLAIN) flags[cnt++] = CStringGetTextDatum("EXPLAIN"); if (record->flags & GUC_NO_RESET_ALL) diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index 4d0920c42e2..bb09c507f81 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -221,14 +221,14 @@ typedef enum #define GUC_UNIT_KB 0x1000 /* value is in kilobytes */ #define GUC_UNIT_BLOCKS 0x2000 /* value is in blocks */ -#define GUC_UNIT_XBLOCKS 0x3000 /* value is in xlog blocks */ +#define GUC_UNIT_XBLOCKS 0x3000 /* value is in xlog blocks */ // #define GUC_UNIT_MB 0x4000 /* value is in megabytes */ #define GUC_UNIT_BYTE 0x8000 /* value is in bytes */ #define GUC_UNIT_MEMORY 0xF000 /* mask for size-related units */ #define GUC_UNIT_MS 0x10000 /* value is in milliseconds */ #define GUC_UNIT_S 0x20000 /* value is in seconds */ -#define GUC_UNIT_MIN 0x30000 /* value is in minutes */ +#define GUC_UNIT_MIN 0x30000 /* value is in minutes */ // #define GUC_UNIT_TIME 0xF0000 /* mask for time-related units */ #define GUC_EXPLAIN 0x100000 /* include in explain */ @@ -239,6 +239,8 @@ typedef enum */ #define GUC_RUNTIME_COMPUTED 0x200000 +#define GUC_DYNAMIC_DEFAULT 0x400000 /* default value is dynamic */ + #define GUC_UNIT (GUC_UNIT_MEMORY | GUC_UNIT_TIME) -- 2.17.1