Re: A assert failure when initdb with track_commit_timestamp=on - Mailing list pgsql-hackers
From | Tom Lane |
---|---|
Subject | Re: A assert failure when initdb with track_commit_timestamp=on |
Date | |
Msg-id | 61810.1751738407@sss.pgh.pa.us Whole thread Raw |
In response to | Re: A assert failure when initdb with track_commit_timestamp=on (Tom Lane <tgl@sss.pgh.pa.us>) |
List | pgsql-hackers |
I wrote: > Fujii Masao <masao.fujii@oss.nttdata.com> writes: >> Or GUC ignore_system_indexes also should be treated in the same way >> as transaction_timeout? > Yes, I'd say we ought to mark that GUC as don't-accept-in-bootstrap > too. I've not done any research about what other GUCs can break > initdb, but now I'm starting to suspect there are several. Here's a fleshed-out implementation of Hayato-san's idea. I've not done anything about reverting 5a6c39b6d, nor have I done any checks to see if there are other GUCs we ought to mark similarly. (But at this point I'd be prepared to bet that there are.) regards, tom lane diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index fc8638c1b61..f6ca9e8632c 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -213,6 +213,12 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) /* Set defaults, to be overridden by explicit options below */ InitializeGUCOptions(); + /* Override ignore_system_indexes: we have no indexes during bootstrap */ + IgnoreSystemIndexes = true; + + /* Set bootstrap mode; note that this locks down values of some GUCs */ + SetProcessingMode(BootstrapProcessing); + /* an initial --boot or --check should be present */ Assert(argc > 1 && (strcmp(argv[1], "--boot") == 0 @@ -321,9 +327,6 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) CreateDataDirLockFile(false); - SetProcessingMode(BootstrapProcessing); - IgnoreSystemIndexes = true; - InitializeMaxBackends(); /* diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 667df448732..215a20a1f06 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -3464,6 +3464,15 @@ set_config_with_handle(const char *name, config_handle *handle, return 0; } + /* + * Certain GUCs aren't safe to enable during bootstrap mode. Silently + * ignore attempts to set them to non-default values. + */ + if (unlikely(IsBootstrapProcessingMode()) && + (record->flags & GUC_NOT_IN_BOOTSTRAP) && + source > PGC_S_DYNAMIC_DEFAULT) + changeVal = false; + /* * Check if the option can be set at this time. See guc.h for the precise * rules. diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index 511dc32d519..064c6ba09e2 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -1089,7 +1089,8 @@ struct config_bool ConfigureNamesBool[] = { {"track_commit_timestamp", PGC_POSTMASTER, REPLICATION_SENDING, gettext_noop("Collects transaction commit time."), - NULL + NULL, + GUC_NOT_IN_BOOTSTRAP }, &track_commit_timestamp, false, @@ -1929,7 +1930,7 @@ struct config_bool ConfigureNamesBool[] = gettext_noop("Disables reading from system indexes."), gettext_noop("It does not prevent updating the indexes, so it is safe " "to use. The worst consequence is slowness."), - GUC_NOT_IN_SAMPLE + GUC_NOT_IN_SAMPLE | GUC_NOT_IN_BOOTSTRAP }, &IgnoreSystemIndexes, false, @@ -2763,7 +2764,7 @@ struct config_int ConfigureNamesInt[] = {"transaction_timeout", PGC_USERSET, CLIENT_CONN_STATEMENT, gettext_noop("Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)."), gettext_noop("0 disables the timeout."), - GUC_UNIT_MS + GUC_UNIT_MS | GUC_NOT_IN_BOOTSTRAP }, &TransactionTimeout, 0, 0, INT_MAX, diff --git a/src/include/utils/guc.h b/src/include/utils/guc.h index f619100467d..0e7e97dabf0 100644 --- a/src/include/utils/guc.h +++ b/src/include/utils/guc.h @@ -228,6 +228,7 @@ typedef enum 0x002000 /* can't set in PG_AUTOCONF_FILENAME */ #define GUC_RUNTIME_COMPUTED 0x004000 /* delay processing in 'postgres -C' */ #define GUC_ALLOW_IN_PARALLEL 0x008000 /* allow setting in parallel mode */ +#define GUC_NOT_IN_BOOTSTRAP 0x010000 /* can't set in bootstrap mode */ #define GUC_UNIT_KB 0x01000000 /* value is in kilobytes */ #define GUC_UNIT_BLOCKS 0x02000000 /* value is in blocks */
pgsql-hackers by date: