page_collect_tuples without long lock on page (Was Re: IPC/MultixactCreation on the Standby server)
Yura Sokolov <y.sokolov@postgrespro.ru>
From: Yura Sokolov <y.sokolov@postgrespro.ru>
To: Andrey Borodin <x4mmm@yandex-team.ru>, Dmitry <dsy.075@yandex.ru>,
alvherre@kurilemu.de
Cc: pgsql-hackers@lists.postgresql.org
Date: 2025-07-29T11:12:29Z
Lists: pgsql-hackers
Attachments
- page_collect_tuples.diff (text/x-patch) patch
17.07.2025 21:34, Andrey Borodin пишет: >> On 30 Jun 2025, at 15:58, Andrey Borodin <x4mmm@yandex-team.ru> wrote: >> page_collect_tuples() holds a lock on the buffer while examining tuples visibility, having InterruptHoldoffCount > 0. Tuple visibility check might need WAL to go on, we have to wait until some next MX be filled in. >> Which might need a buffer lock or have a snapshot conflict with caller of page_collect_tuples(). > > Thinking more about the problem I see 3 ways to deal with this deadlock: > 2. Teach page_collect_tuples() to do HeapTupleSatisfiesVisibility() without holding buffer lock. > > Personally, I see point 2 as very invasive in a code that I'm not too familiar with. If there were no SetHintBits inside of HeapTupleSatisfies* , then it could be just "copy line pointers and tuple headers under lock, release lock, check tuples visibility using copied arrays". But hint bits makes it much more difficult. Probably, tuple headers could be copied twice and compared afterwards. If there are change in hint bits, page should be relocked. And call to MarkBufferDirtyHint should be delayed. A very dirty variant is in attach. I've made it just for fun. It passes 'regress', 'isolation' and 'recovery'. But I didn't benchmark it. -- regards Yura Sokolov aka funny-falcon
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix test to work with non-8kB block sizes
- 7c2061bdfba7 19 (unreleased) landed
-
Fix setting next multixid's offset at offset wraparound
- 48969555447f 14.21 landed
- b9a02b9780bc 15.16 landed
- 4d689a17693e 16.12 landed
- cad40cec24f3 17.8 landed
- 02ba5e3be4f3 18.2 landed
- 4d936c3fff1a 19 (unreleased) landed
-
Add test for multixid wraparound
- 7b81be9b4267 19 (unreleased) landed
-
Set next multixid's offset when creating a new multixid
- 81416e1016dd 14.21 landed
- 8cfb174a61eb 15.16 landed
- 635166913078 16.12 landed
- 8ba61bc06386 17.8 landed
- e46041fd973c 18.2 landed
- 789d65364cde 19 (unreleased) landed
-
psql: Improve tab completion for large objects.
- 14ee8e640300 19 (unreleased) cited
-
Refactor some repetitive SLRU code
- c61678551699 19 (unreleased) cited
-
Transaction IDs wrap around, per my proposal of 13-Aug-01. More
- bc7d37a525c0 7.2.1 cited