This commit adds CHECK_FOR_INTERRUPTS to the shared buffer iteration
loops in EvictRelUnpinnedBuffers and EvictAllUnpinnedBuffers. These
functions, used by pg_buffercache's pg_buffercache_evict_relation and
pg_buffercache_evict_all, can now be interrupted during long-running
operations.
Backpatch to version 18, where these functions and their corresponding
pg_buffercache functions were introduced.
Author: Yuhang Qiu <iamqyh@gmail.com>
Discussion: https://postgr.es/m/
8DC280D4-94A2-4E7B-BAB9-
C345891D0B78%40gmail.com
Backpatch-through: 18
uint32 buf_state;
bool buffer_flushed;
+ CHECK_FOR_INTERRUPTS();
+
buf_state = pg_atomic_read_u32(&desc->state);
if (!(buf_state & BM_VALID))
continue;
uint32 buf_state = pg_atomic_read_u32(&(desc->state));
bool buffer_flushed;
+ CHECK_FOR_INTERRUPTS();
+
/* An unlocked precheck should be safe and saves some cycles. */
if ((buf_state & BM_VALID) == 0 ||
!BufTagMatchesRelFileLocator(&desc->tag, &rel->rd_locator))