From 6b524cdf5d2acd251d084e108ff36c38351b5111 Mon Sep 17 00:00:00 2001 From: zhaobingyu <1783692558@qq.com> Date: Fri, 24 Jun 2022 14:16:37 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3issue=20---=20=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E5=A2=9E=E9=87=8F=E6=A3=80=E6=9F=A5=E7=82=B9=EF=BC=8C?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E5=85=A8=E9=A1=B5=E5=86=99=EF=BC=8C=E6=97=A0?= =?UTF-8?q?=E8=B4=9F=E8=BD=BD=E6=83=85=E5=86=B5=E4=B8=8B=EF=BC=8Ccreate=20?= =?UTF-8?q?database=E8=8A=B1=E8=B4=B925=E7=A7=92?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/storage/buffer/bufmgr.cpp | 26 +++++++++++++---------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/gausskernel/storage/buffer/bufmgr.cpp b/src/gausskernel/storage/buffer/bufmgr.cpp index 1f384f92b..28efb9167 100644 --- a/src/gausskernel/storage/buffer/bufmgr.cpp +++ b/src/gausskernel/storage/buffer/bufmgr.cpp @@ -3323,20 +3323,24 @@ static void BufferSync(int flags) * Header spinlock is enough to examine BM_DIRTY, see comment in * SyncOneBuffer. */ - buf_state = LockBufHdr(buf_desc); + pg_memory_barrier(); + buf_state = pg_atomic_read_u32(&buf_desc->state); if ((buf_state & mask) == mask) { - CkptSortItem *item = NULL; - buf_state |= BM_CHECKPOINT_NEEDED; - item = &g_instance.ckpt_cxt_ctl->CkptBufferIds[num_to_scan++]; - item->buf_id = buf_id; - item->tsId = buf_desc->tag.rnode.spcNode; - item->relNode = buf_desc->tag.rnode.relNode; - item->bucketNode = buf_desc->tag.rnode.bucketNode; - item->forkNum = buf_desc->tag.forkNum; - item->blockNum = buf_desc->tag.blockNum; + buf_state = LockBufHdr(buf_desc); + if ((buf_state & mask) == mask) { + CkptSortItem *item = NULL; + buf_state |= BM_CHECKPOINT_NEEDED; + item = &g_instance.ckpt_cxt_ctl->CkptBufferIds[num_to_scan++]; + item->buf_id = buf_id; + item->tsId = buf_desc->tag.rnode.spcNode; + item->relNode = buf_desc->tag.rnode.relNode; + item->bucketNode = buf_desc->tag.rnode.bucketNode; + item->forkNum = buf_desc->tag.forkNum; + item->blockNum = buf_desc->tag.blockNum; + } + UnlockBufHdr(buf_desc, buf_state); } - UnlockBufHdr(buf_desc, buf_state); } if (num_to_scan == 0) {