diff options
author | Thomas Munro <tmunro@postgresql.org> | 2022-05-11 18:03:03 +1200 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2022-05-11 18:03:03 +1200 |
commit | 0d3431497dbe91ba1e428ace4e9537c109eaff07 (patch) | |
tree | a4bc28645a52f87de2fe0d91455238b1d17cd563 /src | |
parent | f95d53eded55ecbf037f6416ced6af29a2c3caca (diff) | |
download | postgresql-0d3431497dbe91ba1e428ace4e9537c109eaff07.tar.gz postgresql-0d3431497dbe91ba1e428ace4e9537c109eaff07.zip |
Add logging for excessive ProcSignalBarrier waits.
To enable diagnosis of systems that are not processing ProcSignalBarrier
requests promptly, add a LOG message every 5 seconds if we seem to be
wedged. Although you could already see this state as a wait event in
pg_stat_activity, the log message also shows the PID of the process that
is preventing progress.
Also add DEBUG1 logging around the whole wait loop.
Reviewed-by: Robert Haas <robertmhaas@gmail.com>
Discussion: https://postgr.es/m/CA%2BTgmoYJ03r5359gQutRGP9BtigYCg3_UskcmnVjBf-QO3-0pQ%40mail.gmail.com
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/storage/ipc/procsignal.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/src/backend/storage/ipc/procsignal.c b/src/backend/storage/ipc/procsignal.c index 00d66902d8b..21a9fc0fdd2 100644 --- a/src/backend/storage/ipc/procsignal.c +++ b/src/backend/storage/ipc/procsignal.c @@ -393,6 +393,11 @@ WaitForProcSignalBarrier(uint64 generation) { Assert(generation <= pg_atomic_read_u64(&ProcSignal->psh_barrierGeneration)); + elog(DEBUG1, + "waiting for all backends to process ProcSignalBarrier generation " + UINT64_FORMAT, + generation); + for (int i = NumProcSignalSlots - 1; i >= 0; i--) { ProcSignalSlot *slot = &ProcSignal->psh_slot[i]; @@ -407,13 +412,22 @@ WaitForProcSignalBarrier(uint64 generation) oldval = pg_atomic_read_u64(&slot->pss_barrierGeneration); while (oldval < generation) { - ConditionVariableSleep(&slot->pss_barrierCV, - WAIT_EVENT_PROC_SIGNAL_BARRIER); + if (ConditionVariableTimedSleep(&slot->pss_barrierCV, + 5000, + WAIT_EVENT_PROC_SIGNAL_BARRIER)) + ereport(LOG, + (errmsg("still waiting for backend with PID %lu to accept ProcSignalBarrier", + (unsigned long) slot->pss_pid))); oldval = pg_atomic_read_u64(&slot->pss_barrierGeneration); } ConditionVariableCancelSleep(); } + elog(DEBUG1, + "finished waiting for all backends to process ProcSignalBarrier generation " + UINT64_FORMAT, + generation); + /* * The caller is probably calling this function because it wants to read * the shared state or perform further writes to shared state once all |