aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorThomas Munro <tmunro@postgresql.org>2022-05-11 18:03:03 +1200
committerThomas Munro <tmunro@postgresql.org>2022-05-11 18:03:03 +1200
commit0d3431497dbe91ba1e428ace4e9537c109eaff07 (patch)
treea4bc28645a52f87de2fe0d91455238b1d17cd563 /src
parentf95d53eded55ecbf037f6416ced6af29a2c3caca (diff)
downloadpostgresql-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.c18
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