summaryrefslogtreecommitdiff
path: root/src/backend/tcop/postgres.c
diff options
context:
space:
mode:
authorTom Lane2020-12-29 23:02:38 +0000
committerTom Lane2020-12-29 23:02:38 +0000
commit1f9158ba48122fa232db955a2ee324eec1848ba9 (patch)
tree58935fdeca0899ed471ea3037b25903263ea0435 /src/backend/tcop/postgres.c
parentdb6335b5b1d6654b0e3104f36817800d127c1c91 (diff)
Suppress log spam from multiple reports of SIGQUIT shutdown.
When the postmaster sends SIGQUIT to its children, there's no real need for all the children to log that fact; the postmaster already made a log entry about it, so adding perhaps dozens or hundreds of child-process log entries adds nothing of value. So, let's introduce a new ereport level to specify "WARNING, but never send to log" and use that for these messages. Such a change wouldn't have been desirable before commit 7e784d1dc, because if someone manually SIGQUIT's a backend, we *do* want to log that. But now we can tell the difference between a signal that was issued by the postmaster and one that was not with reasonable certainty. While we're here, also clear error_context_stack before ereport'ing, to prevent error callbacks from being invoked in the signal-handler context. This should reduce the odds of getting hung up while trying to notify the client. Per a suggestion from Andres Freund. Discussion: https://postgr.es/m/[email protected]
Diffstat (limited to 'src/backend/tcop/postgres.c')
-rw-r--r--src/backend/tcop/postgres.c16
1 files changed, 14 insertions, 2 deletions
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index d35c5020ea6..317d1aa5730 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -2789,6 +2789,18 @@ quickdie(SIGNAL_ARGS)
* wrong, so there's not much to lose. Assuming the postmaster is still
* running, it will SIGKILL us soon if we get stuck for some reason.
*
+ * One thing we can do to make this a tad safer is to clear the error
+ * context stack, so that context callbacks are not called. That's a lot
+ * less code that could be reached here, and the context info is unlikely
+ * to be very relevant to a SIGQUIT report anyway.
+ */
+ error_context_stack = NULL;
+
+ /*
+ * When responding to a postmaster-issued signal, we send the message only
+ * to the client; sending to the server log just creates log spam, plus
+ * it's more code that we need to hope will work in a signal handler.
+ *
* Ideally these should be ereport(FATAL), but then we'd not get control
* back to force the correct type of process exit.
*/
@@ -2802,7 +2814,7 @@ quickdie(SIGNAL_ARGS)
break;
case PMQUIT_FOR_CRASH:
/* A crash-and-restart cycle is in progress */
- ereport(WARNING,
+ ereport(WARNING_CLIENT_ONLY,
(errcode(ERRCODE_CRASH_SHUTDOWN),
errmsg("terminating connection because of crash of another server process"),
errdetail("The postmaster has commanded this server process to roll back"
@@ -2814,7 +2826,7 @@ quickdie(SIGNAL_ARGS)
break;
case PMQUIT_FOR_STOP:
/* Immediate-mode stop */
- ereport(WARNING,
+ ereport(WARNING_CLIENT_ONLY,
(errcode(ERRCODE_ADMIN_SHUTDOWN),
errmsg("terminating connection due to immediate shutdown command")));
break;