Do CHECK_FOR_INTERRUPTS inside, not before, scanGetItem.
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 26 Aug 2025 15:38:41 +0000 (11:38 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 26 Aug 2025 15:38:41 +0000 (11:38 -0400)
commitb55068236c5e92e211a6bbf8816933fdac02da80
treec8276f0e1cda51f4a8e86c08a3e17f0fe78f1e71
parent5f6f951f88e53630b3ebe9bde762a9612ca6202f
Do CHECK_FOR_INTERRUPTS inside, not before, scanGetItem.

The CHECK_FOR_INTERRUPTS call in gingetbitmap turns out to be
inadequate to prevent a long uninterruptible loop, because
we now know a case where looping occurs within scanGetItem.
While the next patch will fix the bug that caused that, it
seems foolish to assume that no similar patterns are possible.
Let's do the CFI within scanGetItem's retry loop, instead.
This demonstrably allows canceling out of the loop exhibited
in bug #19031.

Bug: #19031
Reported-by: Tim Wood <washwithcare@gmail.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/19031-0638148643d25548@postgresql.org
Backpatch-through: 13
src/backend/access/gin/ginget.c