mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
Support "postgres -C" with runtime-computed GUCs
Until now, the -C option of postgres was handled before a small subset of GUCs computed at runtime are initialized, leading to incorrect results as GUC machinery would fall back to default values for such parameters. For example, data_checksums could report "off" for a cluster as the control file is not loaded yet. Or wal_segment_size would show a segment size at 16MB even if initdb --wal-segsize used something else. Worse, the command would fail to properly report the recently-introduced shared_memory, that requires to load shared_preload_libraries as these could ask for a chunk of shared memory. Support for runtime GUCs comes with a limitation, as the operation is now allowed on a running server. One notable reason for this is that _PG_init() functions of loadable libraries are called before all runtime-computed GUCs are initialized, and this is not guaranteed to be safe to do on running servers. For the case of shared_memory_size, where we want to know how much memory would be used without allocating it, this limitation is fine. Another case where this will help is for huge pages, with the introduction of a different GUC to evaluate the amount of huge pages required for a server before starting it, without having to allocate large chunks of memory. This feature is controlled with a new GUC flag, and four parameters are classified as runtime-computed as of this change: - data_checksums - shared_memory_size - data_directory_mode - wal_segment_size Some TAP tests are added to provide some coverage here, using data_checksums in the tests of pg_checksums. Per discussion with Andres Freund, Justin Pryzby, Magnus Hagander and more. Author: Nathan Bossart Discussion: https://postgr.es/m/F2772387-CE0F-46BF-B5F1-CC55516EB885@amazon.com
This commit is contained in:
@@ -896,15 +896,31 @@ PostmasterMain(int argc, char *argv[])
|
||||
if (output_config_variable != NULL)
|
||||
{
|
||||
/*
|
||||
* "-C guc" was specified, so print GUC's value and exit. No extra
|
||||
* permission check is needed because the user is reading inside the
|
||||
* data dir.
|
||||
* If this is a runtime-computed GUC, it hasn't yet been initialized,
|
||||
* and the present value is not useful. However, this is a convenient
|
||||
* place to print the value for most GUCs because it is safe to run
|
||||
* postmaster startup to this point even if the server is already
|
||||
* running. For the handful of runtime-computed GUCs that we cannot
|
||||
* provide meaningful values for yet, we wait until later in
|
||||
* postmaster startup to print the value. We won't be able to use -C
|
||||
* on running servers for those GUCs, but using this option now would
|
||||
* lead to incorrect results for them.
|
||||
*/
|
||||
const char *config_val = GetConfigOption(output_config_variable,
|
||||
false, false);
|
||||
int flags = GetConfigOptionFlags(output_config_variable, true);
|
||||
|
||||
puts(config_val ? config_val : "");
|
||||
ExitPostmaster(0);
|
||||
if ((flags & GUC_RUNTIME_COMPUTED) == 0)
|
||||
{
|
||||
/*
|
||||
* "-C guc" was specified, so print GUC's value and exit. No
|
||||
* extra permission check is needed because the user is reading
|
||||
* inside the data dir.
|
||||
*/
|
||||
const char *config_val = GetConfigOption(output_config_variable,
|
||||
false, false);
|
||||
|
||||
puts(config_val ? config_val : "");
|
||||
ExitPostmaster(0);
|
||||
}
|
||||
}
|
||||
|
||||
/* Verify that DataDir looks reasonable */
|
||||
@@ -1033,6 +1049,26 @@ PostmasterMain(int argc, char *argv[])
|
||||
*/
|
||||
InitializeShmemGUCs();
|
||||
|
||||
/*
|
||||
* If -C was specified with a runtime-computed GUC, we held off printing
|
||||
* the value earlier, as the GUC was not yet initialized. We handle -C
|
||||
* for most GUCs before we lock the data directory so that the option may
|
||||
* be used on a running server. However, a handful of GUCs are runtime-
|
||||
* computed and do not have meaningful values until after locking the data
|
||||
* directory, and we cannot safely calculate their values earlier on a
|
||||
* running server. At this point, such GUCs should be properly
|
||||
* initialized, and we haven't yet set up shared memory, so this is a good
|
||||
* time to handle the -C option for these special GUCs.
|
||||
*/
|
||||
if (output_config_variable != NULL)
|
||||
{
|
||||
const char *config_val = GetConfigOption(output_config_variable,
|
||||
false, false);
|
||||
|
||||
puts(config_val ? config_val : "");
|
||||
ExitPostmaster(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* Set up shared memory and semaphores.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user