]> granicus.if.org Git - postgresql/commitdiff
In bootstrap mode, use default signal handling for SIGINT etc.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 14 May 2019 14:22:28 +0000 (10:22 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 14 May 2019 14:22:28 +0000 (10:22 -0400)
Previously, the code pointed the standard process-termination signals
to postgres.c's die().  That would typically result in an attempt to
execute a transaction abort, which is not possible in bootstrap mode,
leading to PANIC.  This choice seems to be a leftover from an old code
structure in which the same signal-assignment code was used for many
sorts of auxiliary processes, including interactive standalone
backends.  It's not very sensible for bootstrap mode, which has no
interest in either interactivity or continuing after an error.  We can
get better behavior with less effort by just letting normal process
termination happen, after which the parent initdb process will clean up.

This is basically cosmetic in any case, since initdb will react the
same way whether bootstrap dies on a signal or abort().  Given the
lack of previous complaints, I don't feel a need to back-patch,
even though the behavior is old.

Discussion: https://postgr.es/m/3850b11a.5121.16aaf827e4a.Coremail.thunder1@126.com

src/backend/bootstrap/bootstrap.c

index d8776e192ea2e56bfdbfe5cd7cef654e9c6d3369..43627ab8f4e7a1d710fb878d64193a5508fb755d 100644 (file)
@@ -558,11 +558,15 @@ bootstrap_signals(void)
 {
        Assert(!IsUnderPostmaster);
 
-       /* Set up appropriately for interactive use */
-       pqsignal(SIGHUP, die);
-       pqsignal(SIGINT, die);
-       pqsignal(SIGTERM, die);
-       pqsignal(SIGQUIT, die);
+       /*
+        * We don't actually need any non-default signal handling in bootstrap
+        * mode; "curl up and die" is a sufficient response for all these cases.
+        * Let's set that handling explicitly, as documentation if nothing else.
+        */
+       pqsignal(SIGHUP, SIG_DFL);
+       pqsignal(SIGINT, SIG_DFL);
+       pqsignal(SIGTERM, SIG_DFL);
+       pqsignal(SIGQUIT, SIG_DFL);
 }
 
 /*