Re: relfrozenxid may disagree with row XIDs after 1ccc1e05ae
Melanie Plageman <melanieplageman@gmail.com>
Commits
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Ensure vacuum removes all visibly dead tuples older than OldestXmin
- 06bf404cd07b 16.4 landed
- 45ce054c02b8 14.13 landed
- dc6354c67017 15.8 landed
-
Combine freezing and pruning steps in VACUUM
- 6dbb490261a6 17.0 cited
-
Handle non-chain tuples outside of heap_prune_chain()
- 6f47f6883151 17.0 cited
-
Fix false reports in pg_visibility
- e85662df44ff 17.0 cited
-
Remove retry loop in heap_page_prune().
- 1ccc1e05ae8f 17.0 cited
-
vacuumlazy.c: document vistest and OldestXmin.
- 73f6ec3d3c8d 15.0 cited
-
Deduplicate choice of horizon for a relation procarray.c.
- d9d8aa9bb9aa 15.0 cited
-
Remove tupgone special case from vacuumlazy.c.
- 8523492d4e34 14.0 cited
-
Simplify state managed by VACUUM.
- b4af70cb2103 14.0 cited
-
Recycle nbtree pages deleted during same VACUUM.
- 9dd963ae2534 14.0 cited
-
snapshot scalability: Don't compute global horizons while building snapshots.
- dc7420c2c927 14.0 cited
-
Raise error when affecting tuple moved into different partition.
- f16241bef7cc 11.0 cited
Attachments
- fix_hang_15.patch (text/x-patch) patch v1
On Mon, May 13, 2024 at 11:42 PM Bowen Shi <zxwsbg12138@gmail.com> wrote: > > On Mon, May 13, 2024 at 10:42 PM Melanie Plageman <melanieplageman@gmail.com> wrote: >> >> On Sun, May 12, 2024 at 11:19 PM Bowen Shi <zxwsbg12138@gmail.com> wrote: >> > >> > Hi, >> >> >> >> Obviously we should actually fix this on back branches, but could we >> >> at least make the retry loop interruptible in some way so people could >> >> use pg_cancel/terminate_backend() on a stuck autovacuum worker or >> >> vacuum process? >> > >> > >> > If the problem happens in versions <= PG 16, we don't have a good solution (vacuum process holds the exclusive lock cause checkpoint hangs). >> > >> > Maybe we can make the retry loop interruptible first. However, since we are using START_CRIT_SECTION, we cannot simply use CHECK_FOR_INTERRUPTS to handle it. >> >> As far as I can tell, in 14 and 15, the versions where the issue >> reported here is present, there is not a critical section in the >> section of code looped through in the retry loop in lazy_scan_prune(). > > > You are correct, I tried again to add CHECK_FOR_INTERRUPTS in the retry loop, and when attempting to interrupt the current loop using the pg_terminate_backend function, the value of InterruptHoldoffCount is 1, which causes the vacuum to not end. Yes, great point. Actually, Andres and I discussed this today off-list, and he reminded me that because vacuum is holding a content lock on the page here, InterruptHoldoffCount will be at least 1. We could RESUME_INTERRUPTS() but we probably don't want to process interrupts while holding the page lock here if we don't do it in other places. And it's hard to say under what conditions we would want to drop the page lock here. Are you reproducing the hang locally with my repro? Or do you have your own repro? How are you testing pg_terminate_backend() and seeing that the InterruptHoldoffCount is 1? >> We can actually fix the particular issue I reproduced with the >> attached patch. However, I think it is still worth making the retry >> loop interruptible in case there are other ways to end up infinitely >> looping in the retry loop in lazy_scan_prune(). > > > I attempted to apply the patch on the REL_15_STABLE branch, but encountered some conflicts. May I ask which branch you are using? Sorry, I should have mentioned that patch was against REL_14_STABLE. Attached patch has the same functionality but should apply cleanly against REL_15_STABLE. - Melanie