Unpin buffer before inplace update waits for an XID to end.
Noah Misch <noah@leadboat.com>
Unpin buffer before inplace update waits for an XID to end. Commit a07e03fd8fa7daf4d1356f7cb501ffe784ea6257 changed inplace updates to wait for heap_update() commands like GRANT TABLE and GRANT DATABASE. By keeping the pin during that wait, a sequence of autovacuum workers and an uncommitted GRANT starved one foreground LockBufferForCleanup() for six minutes, on buildfarm member sarus. Prevent, at the cost of a bit of complexity. Back-patch to v12, like the earlier commit. That commit and heap_inplace_lock() have not yet appeared in any release. Discussion: https://postgr.es/m/20241026184936.ae.nmisch@google.com
Files
| Path | Change | +/− |
|---|---|---|
| src/backend/access/heap/heapam.c | modified | +7 −3 |
| src/backend/access/index/genam.c | modified | +5 −7 |
| src/include/access/heapam.h | modified | +2 −1 |
Discussion
- heap_inplace_lock vs. autovacuum w/ LOCKTAG_TUPLE 4 messages · 2024-10-26 → 2024-10-27