Re: Buffer locking is special (hints, checksums, AIO writes)
Andres Freund <andres@anarazel.de>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Require share-exclusive lock to set hint bits and to flush
- 82467f627bd4 19 (unreleased) landed
-
lwlock: Remove ForEachLWLockHeldByMe
- 55fbfb738b00 19 (unreleased) landed
-
bufmgr: Implement buffer content locks independently of lwlocks
- fcb9c977aa5f 19 (unreleased) landed
-
bufmgr: Change BufferDesc.state to be a 64-bit atomic
- dac328c8a682 19 (unreleased) landed
-
heapam: Add batch mode mvcc check and use it in page mode
- 0b96e734c590 19 (unreleased) landed
-
freespace: Don't modify page without any lock
- 45f658dacb9c 19 (unreleased) landed
-
heapam: Move logic to handle HEAP_MOVED into a helper function
- 548de59d93d5 19 (unreleased) landed
-
bufmgr: Optimize & harmonize LockBufHdr(), LWLockWaitListLock()
- 09ae2c8bac8d 19 (unreleased) landed
-
bufmgr: Add one-entry cache for private refcount
- 30df61990c67 19 (unreleased) landed
-
bufmgr: Separate keys for private refcount infrastructure
- edbaaea0a95e 19 (unreleased) landed
-
Add pg_atomic_unlocked_write_u64
- 7902a47c20b1 19 (unreleased) landed
-
Rename BUFFERPIN wait event class to BUFFER
- 6c5c393b7403 19 (unreleased) landed
-
bufmgr: Turn BUFFER_LOCK_* into an enum
- 156680055dc5 19 (unreleased) landed
-
lwlock: Fix, currently harmless, bug in LWLockWakeup()
- 81f773895321 19 (unreleased) landed
- da3971496531 15.16 landed
- 89c8a1b9069f 16.12 landed
- 427e886a79a5 17.8 landed
- 332693e75969 14.21 landed
- 8082b759d9b5 18.2 landed
-
bufmgr: Use atomic sub for unpinning buffers
- 5310fac6e0fc 19 (unreleased) landed
-
bufmgr: Allow some buffer state modifications while holding header lock
- c75ebc657ffc 19 (unreleased) landed
-
bufmgr: Fix valgrind checking for buffers pinned in StrategyGetBuffer()
- c819d1017ddb 19 (unreleased) landed
-
bufmgr: Don't lock buffer header in StrategyGetBuffer()
- 5e8998592879 19 (unreleased) landed
-
bufmgr: fewer calls to BufferDescriptorGetContentLock
- 3baae90013df 19 (unreleased) landed
-
bufmgr: Fix signedness of mask variable in BufferSync()
- 2a2e1b470b9b 19 (unreleased) landed
-
bufmgr: Introduce FlushUnlockedBuffer
- 3c2b97b29ee3 19 (unreleased) landed
-
Improve ReadRecentBuffer() scalability
- 819dc118c0f6 19 (unreleased) landed
Attachments
- v3-0001-Improve-ReadRecentBuffer-scalability.patch (text/x-diff)
Hi, On 2025-08-22 15:44:48 -0400, Andres Freund wrote: > The hardest part about this change is that everything kind of depends on each > other. The changes are large enough that they clearly can't just be committed > at once, but doing them over time risks [temporary] performance regressions. > > > > > The order of changes I think makes the most sense is the following: > > 1) Allow some modifications while holding the buffer header spinlock > > 2) Reduce buffer pin with just an atomic-sub > > This needs to happen first, otherwise there are performance regressions > during the later steps. Here are the first few cleaned up patches implementing the above steps, as well as some cleanups. I included a commit from another thread, as it conflicts with these changes, and we really should apply it - and it's arguably required to make the changes viable, as it removes one more use of PinBuffer_Locked(). Another change included is to not return the buffer with the spinlock held from StrategyGetBuffer(), and instead pin the buffer in freelist.c. The reason for that is to reduce the most common PinBuffer_locked() call. By definition PinBuffer_locked() will become a bit slower due to 0003. But even without 0003 it 0002 is faster than master. And the previous approach also just seems pretty unclean. I don't love that it requires the new TrackNewBufferPin(), but I don't really have a better idea. I invite particular attention to the commit message for 0003 as well as the comment changes in buf_internals.h within. I'm not sure I like the TODOs added in 0003 and removed in 0004, but squashing the changes doesn't really seem better either. Greetings, Andres Freund