| From: | Noah Misch <noah(at)leadboat(dot)com> |
|---|---|
| To: | pgsql-hackers(at)postgresql(dot)org |
| Cc: | nathandbossart(at)gmail(dot)com |
| Subject: | Fix early elog(FATAL) |
| Date: | 2024-12-08 03:46:14 |
| Message-ID: | 20241208034614.45.nmisch@google.com |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
main() says:
/*
* Fire up essential subsystems: error and memory management
*
* Code after this point is allowed to use elog/ereport, though
* localization of messages may not work right away, and messages won't go
* anywhere but stderr until GUC settings get loaded.
*/
MemoryContextInit();
However, appending elog(ERROR, "whoops") breaks like:
$ initdb -D discard_me
FATAL: whoops
PANIC: proc_exit() called in child process
no data was returned by command ""/home/nm/sw/nopath/pghead/bin/postgres" -V"
child process was terminated by signal 6: Aborted
So does the ereport(FATAL) in ClosePostmasterPorts(). The "called in child
process" check (added in commit 97550c0 of 2023-10) reads MyProcPid, which we
set later. Three ways to fix this:
1. Call InitProcessGlobals() earlier. This could also reduce the total call
sites from 3 to 2 (main() and post-fork).
2. Move MyProcPid init out of InitProcessGlobals(), to main() and post-fork.
This has less to go wrong in back branches. While probably irrelevant,
this avoids calling pg_prng_strong_seed() in processes that will exit after
help() or GucInfoMain().
3. Revert 97550c0, as commit 3b00fdb anticipated.
I don't think the choice matters much, so here is (2).
| Attachment | Content-Type | Size |
|---|---|---|
| early-elog-v1.patch | text/plain | 2.9 KB |
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Kirill Reshke | 2024-12-08 04:22:53 | Re: Add missing tab completion for ALTER TABLE ADD COLUMN IF NOT EXISTS |
| Previous Message | Andy Fan | 2024-12-08 03:23:47 | Re: postgres_fdw: Provide better emulation of READ COMMITTED behavior |