Re: refactoring relation extension and BufferAlloc(), faster COPY
Andres Freund <andres@anarazel.de>
Hi, On 2023-02-10 18:38:50 +0200, Heikki Linnakangas wrote: > I'll continue reviewing this, but here's some feedback on the first two > patches: > > v2-0001-aio-Add-some-error-checking-around-pinning.patch: > > I wonder if the extra assertion in LockBufHdr() is worth the overhead. It > won't add anything without assertions, of course, but still. No objections > if you think it's worth it. It's so easy to get confused about local/non-local buffers, that I think it is useful. I think we really need to consider cleaning up the separation further. Having half the code for local buffers in bufmgr.c and the other half in localbuf.c, without a scheme that I can recognize, is not a good scheme. It bothers me somewhat ConditionalLockBufferForCleanup() silently accepts multiple pins by the current backend. That's the right thing for e.g. heap_page_prune_opt(), but for something like lazy_scan_heap() it's not. And yes, I did encounter a bug hidden by that when making vacuumlazy use AIO as part of that patchset. That's why I made BufferCheckOneLocalPin() externally visible. > v2-0002-hio-Release-extension-lock-before-initializing-pa.patch: > > Looks as far as it goes. It's a bit silly that we use RBM_ZERO_AND_LOCK, > which zeroes the page, and then we call PageInit to zero the page again. > RBM_ZERO_AND_LOCK only zeroes the page if it wasn't in the buffer cache > previously, but with P_NEW, that is always true. It is quite silly, and it shows up noticably in profiles. The zeroing is definitely needed in other places calling PageInit(), though. I suspect we should have a PageInitZeroed() or such, that asserts the page is zero, but otherwise skips it. Seems independent enough from this series, that I'd probably tackle it separately? If you prefer, I'm ok with adding a patch to this series instead, though. Greetings, Andres Freund
Commits
-
lwlock: Fix quadratic behavior with very long wait lists
- 81038228582a 12.18 landed
- dc9d424cf0cd 13.14 landed
- 5f6ec27a6477 14.11 landed
- f374fb4aab3e 15.6 landed
- a4adc31f6902 16.0 landed
-
Support RBM_ZERO_AND_CLEANUP_LOCK in ExtendBufferedRelTo(), add tests
- 43a33ef54e50 16.0 landed
-
Use ExtendBufferedRelTo() in XLogReadBufferExtended()
- 26158b852d3a 16.0 landed
-
hio: Use ExtendBufferedRelBy() to extend tables more efficiently
- 00d1e02be249 16.0 landed
-
heapam: Pass number of required pages to RelationGetBufferForTuple()
- 5279e9db8e8d 16.0 landed
-
Convert many uses of ReadBuffer[Extended](P_NEW) to ExtendBufferedRel()
- acab1b0914e4 16.0 landed
-
Use ExtendBufferedRelTo() in {vm,fsm}_extend()
- fcdda1e4b502 16.0 landed
-
bufmgr: Introduce infrastructure for faster relation extension
- 31966b151e6a 16.0 landed
-
bufmgr: Support multiple in-progress IOs by using resowner
- 12f3867f5534 16.0 landed
-
bufmgr: Acquire and clean victim buffer separately
- dad50f677c42 16.0 landed
-
bufmgr: Add Pin/UnpinLocalBuffer()
- 794f25944790 16.0 landed
-
bufmgr: Add some more error checking [infrastructure] around pinning
- 819b69a81d30 16.0 landed
-
Add smgrzeroextend(), FileZero(), FileFallocate()
- 4d330a61bb19 16.0 landed
-
Don't initialize page in {vm,fsm}_extend(), not needed
- 3d6a98457d8e 16.0 landed
-
bufmgr: Remove buffer-write-dirty tracepoints
- 8a2b1b147728 16.0 landed
-
hio: Release extension lock before initializing page / pinning VM
- 14f98e0af996 16.0 landed
-
bufmgr: Fix undefined behaviour with, unrealistically, large temp_buffers
- 558cf8038768 16.0 landed
-
Fix memory leak and inefficiency in CREATE DATABASE ... STRATEGY WAL_LOG
- 5df319f3d55d 16.0 cited
-
pgstat: Track more detailed relation IO statistics
- f30d62c2fc60 16.0 cited
-
Use unnamed POSIX semaphores on Cygwin.
- f2857af485a0 16.0 cited
-
Include RelFileLocator fields individually in BufferTag.
- 82ac34db2036 16.0 cited