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 262595.1751649473@sss.pgh.pa.us
Whole thread Raw
In response to Re: A assert failure when initdb with track_commit_timestamp=on  (Fujii Masao <masao.fujii@oss.nttdata.com>)
List pgsql-hackers
Fujii Masao <masao.fujii@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
transactiontimeout 
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.

pgsql-hackers by date:

Previous
From: Alvaro Herrera
Date:
Subject: Re: [HACKERS] pg_upgrade failed with error - ERROR: column "a" in child table must be marked NOT NULL
Next
From: Matthias van de Meent
Date:
Subject: Re: Bloom Filter improvements in postgesql