Two small bugs in guc.c
Tom Lane <tgl@sss.pgh.pa.us>
From: Tom Lane <tgl@sss.pgh.pa.us>
To: pgsql-hackers@lists.postgresql.org
Date: 2023-12-26T19:02:33Z
Lists: pgsql-hackers
Attachments
- v1-fix-set_config_option-logic-bugs.patch (text/x-diff) patch v1
I investigated the report at [1] about pg_file_settings not reporting
invalid values of "log_connections". It turns out it's broken for
PGC_BACKEND and PGC_SU_BACKEND parameters, but not other ones.
The cause is a bit of premature optimization in this logic:
* If a PGC_BACKEND or PGC_SU_BACKEND parameter is changed in
* the config file, we want to accept the new value in the
* postmaster (whence it will propagate to
* subsequently-started backends), but ignore it in existing
* backends. ...
Upon detecting that case, set_config_option just returns -1 immediately
without bothering to validate the value. It should check for invalid
input before returning -1, which we can mechanize with a one-line fix:
- return -1;
+ changeVal = false;
While studying this, I also noted that the bit to prevent changes in
parallel workers seems seriously broken:
if (IsInParallelMode() && changeVal && action != GUC_ACTION_SAVE)
ereport(elevel,
(errcode(ERRCODE_INVALID_TRANSACTION_STATE),
errmsg("cannot set parameters during a parallel operation")));
This is evidently assuming that ereport() won't return, which seems
like a very dubious assumption given the various values that elevel
can have. Maybe it's accidentally true -- I don't recall any
reports of trouble here -- but it sure looks fragile.
Hence, proposed patch attached.
regards, tom lane
[1] https://www.postgresql.org/message-id/flat/CAK30z9T9gaF_isNquccZxi7agXCSjPjMsFXiifmkfu4VpZguxw%40mail.gmail.com
Commits
-
Fix failure to verify PGC_[SU_]BACKEND GUCs in pg_file_settings view.
- ea61b1cf6470 12.18 landed
- e87252ceb8dc 16.2 landed
- cb88f44ec805 13.14 landed
- bf4f30a0fada 14.11 landed
- 76dd3d94a504 15.6 landed
- 059de3ca4766 17.0 landed