diff --git a/src/gausskernel/storage/buffer/bufmgr.cpp b/src/gausskernel/storage/buffer/bufmgr.cpp index 2b3b1a023..1752b5388 100644 --- a/src/gausskernel/storage/buffer/bufmgr.cpp +++ b/src/gausskernel/storage/buffer/bufmgr.cpp @@ -620,6 +620,11 @@ static volatile BufferDesc *PageListBufferAlloc(SMgrRelation smgr, char relpersi /* Pin the buffer and then release the buffer spinlock */ PinBuffer_Locked(buf); + if (!SSPageCheckIfCanEliminate(buf)) { + UnpinBuffer(buf, true); + return NULL; + } + /* * At this point, the victim buffer is pinned * but no locks are held. diff --git a/src/gausskernel/storage/smgr/segment/segbuffer.cpp b/src/gausskernel/storage/smgr/segment/segbuffer.cpp index d13a09e9c..f6a297334 100644 --- a/src/gausskernel/storage/smgr/segment/segbuffer.cpp +++ b/src/gausskernel/storage/smgr/segment/segbuffer.cpp @@ -704,6 +704,11 @@ BufferDesc *SegBufferAlloc(SegSpace *spc, RelFileNode rnode, ForkNumber forkNum, SegPinBufferLocked(buf, &new_tag); + if (!SSPageCheckIfCanEliminate(buf)) { + SegUnpinBuffer(buf); + continue; + } + if (old_flags & BM_DIRTY) { /* backend should not flush dirty pages if working version less than DW_SUPPORT_NEW_SINGLE_FLUSH */ if (!backend_can_flush_dirty_page()) {