pgsql: Split ProcSleep function into JoinWaitQueue and ProcSleep

From: Heikki Linnakangas <heikki(dot)linnakangas(at)iki(dot)fi>
To: pgsql-committers(at)lists(dot)postgresql(dot)org
Subject: pgsql: Split ProcSleep function into JoinWaitQueue and ProcSleep
Date: 2024-11-04 16:02:36
Message-ID: E1t7zXI-0009xX-I2@gemulon.postgresql.org
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-committers

Split ProcSleep function into JoinWaitQueue and ProcSleep

Split ProcSleep into two functions: JoinWaitQueue and ProcSleep.
JoinWaitQueue is called while holding the partition lock, and inserts
the current process to the wait queue, while ProcSleep() does the
actual sleeping. ProcSleep() is now called without holding the
partition lock, and it no longer re-acquires the partition lock before
returning. That makes the wakeup a little cheaper. Once upon a time,
re-acquiring the partition lock was needed to prevent a signal handler
from longjmping out at a bad time, but these days our signal handlers
just set flags, and longjmping can only happen at points where we
explicitly run CHECK_FOR_INTERRUPTS().

If JoinWaitQueue detects an "early deadlock" before even joining the
wait queue, it returns without changing the shared lock entry, leaving
the cleanup of the shared lock entry to the caller. This makes the
handling of an early deadlock the same as the dontWait=true case.

One small user-visible side-effect of this refactoring is that we now
only set the 'ps' title to say "waiting" when we actually enter the
sleep, not when the lock is skipped because dontWait=true, or when a
deadlock is detected early before entering the sleep.

This eliminates the 'lockAwaited' global variable in proc.c, which was
largely redundant with 'awaitedLock' in lock.c

Note: Updating the local lock table is now the caller's responsibility.
JoinWaitQueue and ProcSleep are now only responsible for modifying the
shared state. Seems a little nicer that way.

Based on Thomas Munro's earlier patch and observation that ProcSleep
doesn't really need to re-acquire the partition lock.

Reviewed-by: Maxim Orlov
Discussion: https://www.postgresql.org/message-id/7c2090cd-a72a-4e34-afaa-6dd2ef31440e@iki.fi

Branch
------
master

Details
-------
https://git.postgresql.org/pg/commitdiff/3c0fd64fec8ed6fa3987c33f076fcffbc3f268c3

Modified Files
--------------
src/backend/storage/lmgr/lock.c | 216 +++++++++++++++++++++-------------------
src/backend/storage/lmgr/proc.c | 144 +++++++++++++--------------
src/backend/tcop/postgres.c | 2 +-
src/include/storage/lock.h | 2 +
src/include/storage/proc.h | 7 +-
5 files changed, 185 insertions(+), 186 deletions(-)

Browse pgsql-committers by date

  From Date Subject
Next Message Peter Geoghegan 2024-11-04 16:05:12 pgsql: nbtree: Remove useless 'strat' local variable.
Previous Message Heikki Linnakangas 2024-11-04 15:57:19 Re: pgsql: Implement pg_wal_replay_wait() stored procedure