mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
Add CHECK_FOR_INTERRUPTS in Evict{Rel,All}UnpinnedBuffers.
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
This commit is contained in:
@@ -6685,6 +6685,8 @@ EvictAllUnpinnedBuffers(int32 *buffers_evicted, int32 *buffers_flushed,
|
|||||||
uint32 buf_state;
|
uint32 buf_state;
|
||||||
bool buffer_flushed;
|
bool buffer_flushed;
|
||||||
|
|
||||||
|
CHECK_FOR_INTERRUPTS();
|
||||||
|
|
||||||
buf_state = pg_atomic_read_u32(&desc->state);
|
buf_state = pg_atomic_read_u32(&desc->state);
|
||||||
if (!(buf_state & BM_VALID))
|
if (!(buf_state & BM_VALID))
|
||||||
continue;
|
continue;
|
||||||
@@ -6735,6 +6737,8 @@ EvictRelUnpinnedBuffers(Relation rel, int32 *buffers_evicted,
|
|||||||
uint32 buf_state = pg_atomic_read_u32(&(desc->state));
|
uint32 buf_state = pg_atomic_read_u32(&(desc->state));
|
||||||
bool buffer_flushed;
|
bool buffer_flushed;
|
||||||
|
|
||||||
|
CHECK_FOR_INTERRUPTS();
|
||||||
|
|
||||||
/* An unlocked precheck should be safe and saves some cycles. */
|
/* An unlocked precheck should be safe and saves some cycles. */
|
||||||
if ((buf_state & BM_VALID) == 0 ||
|
if ((buf_state & BM_VALID) == 0 ||
|
||||||
!BufTagMatchesRelFileLocator(&desc->tag, &rel->rd_locator))
|
!BufTagMatchesRelFileLocator(&desc->tag, &rel->rd_locator))
|
||||||
|
|||||||
Reference in New Issue
Block a user