Re: Buffer locking is special (hints, checksums, AIO writes)

From: Heikki Linnakangas <hlinnaka(at)iki(dot)fi>
To: Andres Freund <andres(at)anarazel(dot)de>
Cc: Melanie Plageman <melanieplageman(at)gmail(dot)com>, Matthias van de Meent <boekewurm+postgres(at)gmail(dot)com>, pgsql-hackers(at)postgresql(dot)org, Thomas Munro <thomas(dot)munro(at)gmail(dot)com>, Noah Misch <noah(at)leadboat(dot)com>, Robert Haas <robertmhaas(at)gmail(dot)com>, Michael Paquier <michael(dot)paquier(at)gmail(dot)com>
Subject: Re: Buffer locking is special (hints, checksums, AIO writes)
Date: 2025-12-18 17:20:38
Message-ID: 1108f18d-cf7c-4f17-b29c-a119fe42f7e5@iki.fi
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On 18/12/2025 19:03, Andres Freund wrote:
> Hi,
>
> On 2025-12-17 09:54:32 -0500, Andres Freund wrote:
>> On 2025-12-17 11:25:50 +0200, Heikki Linnakangas wrote:
>>> - LWLockWaitListLock() uses pg_atomic_read_u32() after spinning,
>>> LockBufHdr() retries directly with pg_atomic_fetch_or_u32().
>>
>> I think here LWLockWaitListLock() is likely right - but it seems like a change
>> to LockBufHdr() that I would probably make in a separate commit?
>
> FWIW, I couldn't come up with a scenario where it makes a performance
> difference - exclusive content locks just aren't *that* frequent. And because
> of that the wait list lock doesn't have similar contention as some non-content
> lwlocks (like XidGenLock). The most extreme workload I could think of was
> pgbench hammering a single sequence across many sessions. While the exclusive
> locks show up in wait events, the buffer header spinlock itself doesn't..
>
> So I'm inclined to not change anything about this for now.

Ok. My thinking was just that LockBufHdr() and LWLockWaitListLock()
should be consistent with each other. Otherwise anyone reading the code
will ask the question "why are they different?". They're the only two
things using the spin delay mechanism in our codebase, in addition to
actual spinlocks.

BTW, I wonder if it would be worthwhile to have an inlineable fast-path
of LockBufHdr() for the common case that the lock is free? I see that
UnlockBufHdr() is already a static inline function.

- Heikki

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Oleg Tkachenko 2025-12-18 17:23:53 Re: [BUG] [PATCH] pg_basebackup produces wrong incremental files after relation truncation in segmented tables
Previous Message Arunprasad Rajkumar 2025-12-18 17:15:37 Re: [PATCH] Skip unpublishable child tables when adding parent to publication