Fujii Masao <masao.fu...@oss.nttdata.com> writes: > On 2025/07/05 0:30, Tom Lane wrote: >> As I remarked in the other thread, I don't like inventing a different >> solution for each GUC. So if there are even two that need something >> done, I think Hayato-san's idea has merit.
> This code seems to assume that the processing mode is switched to bootstrap > before > GUC parameters are processed. But is that actually the case? Oh, good point. But there doesn't seem to be any ill effect from making BootstrapModeMain set BootstrapProcessing a bit earlier. Attached is a proof-of-concept that I've actually tested. However, what I find with this POC is that initdb -c transaction_timeout=10s goes through fine, but (at least on my machine) initdb -c transaction_timeout=1 yields ... running bootstrap script ... ok performing post-bootstrap initialization ... 2025-07-04 13:08:04.225 EDT [261836] FATAL: terminating connection due to transaction timeout child process exited with exit code 1 because 1ms is not enough time to complete the post-bootstrap run. I would argue that that's pilot error and we did exactly what the user demanded, but is there anyone who wants to say that we should suppress such GUCs during post-bootstrap too? regards, tom lane
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index fc8638c1b61..facad43c74c 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -220,6 +220,9 @@ BootstrapModeMain(int argc, char *argv[], bool check_only) argv++; argc--; + SetProcessingMode(BootstrapProcessing); + IgnoreSystemIndexes = true; + while ((flag = getopt(argc, argv, "B:c:d:D:Fkr:X:-:")) != -1) { switch (flag) @@ -321,9 +324,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..9555b363c34 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()) && + strcmp(record->name, "transaction_timeout") == 0 && + source != PGC_S_DEFAULT) + changeVal = false; + /* * Check if the option can be set at this time. See guc.h for the precise * rules.