From 490edec3ee5f58d531d574cd2587f7d2a1b2cab5 Mon Sep 17 00:00:00 2001 From: "arcoalien@qq.com" Date: Wed, 22 Mar 2023 20:08:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9B=9E=E6=94=BE=E8=BF=87?= =?UTF-8?q?=E7=A8=8B=E4=B8=AD=E9=81=87=E5=88=B0read=20mode=E6=98=AFzero=20?= =?UTF-8?q?and=20lock=E5=AF=BC=E8=87=B4=E7=9A=84=E5=8F=8D=E5=A4=8D?= =?UTF-8?q?=E4=B8=8A=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../storage/access/transam/xlogutils.cpp | 28 +++++++++++-------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/gausskernel/storage/access/transam/xlogutils.cpp b/src/gausskernel/storage/access/transam/xlogutils.cpp index 732931df8..6692dca39 100644 --- a/src/gausskernel/storage/access/transam/xlogutils.cpp +++ b/src/gausskernel/storage/access/transam/xlogutils.cpp @@ -1146,13 +1146,15 @@ Buffer XLogReadBufferExtendedForHeapDisk(const RelFileNode &rnode, ForkNumber fo * there should be no other backends that could modify the buffer at * the same time. */ - if (ENABLE_DMS) { + bool buffer_is_locked = false; + if (ENABLE_DMS && (GetDmsBufCtrl(buffer - 1)->lock_mode == DMS_LOCK_NULL)) { + buffer_is_locked = true; LockBuffer(buffer, BUFFER_LOCK_SHARE); } if (PageIsNew(page)) { Assert(!PageIsLogical(page)); - if (ENABLE_DMS) { + if (ENABLE_DMS && buffer_is_locked) { LockBuffer(buffer, BUFFER_LOCK_UNLOCK); } ReleaseBuffer(buffer); @@ -1166,7 +1168,7 @@ Buffer XLogReadBufferExtendedForHeapDisk(const RelFileNode &rnode, ForkNumber fo return InvalidBuffer; } - if (ENABLE_DMS) { + if (ENABLE_DMS && buffer_is_locked) { LockBuffer(buffer, BUFFER_LOCK_UNLOCK); } } @@ -1217,14 +1219,16 @@ Buffer XLogReadBufferExtendedForSegpage(const RelFileNode &rnode, ForkNumber for if (BufferIsValid(buffer)) { Page page = BufferGetPage(buffer); - if (ENABLE_DMS) { - LockBuffer(buffer, BUFFER_LOCK_SHARE); - } - if (mode == RBM_NORMAL) { + bool buffer_is_locked = false; + if (ENABLE_DMS && (GetDmsBufCtrl(buffer - 1)->lock_mode == DMS_LOCK_NULL)) { + buffer_is_locked = true; + LockBuffer(buffer, BUFFER_LOCK_SHARE); + } + if (PageIsNew(page)) { SegmentCheck(XLogRecPtrIsInvalid(PageGetLSN(page))); - if (ENABLE_DMS) { + if (ENABLE_DMS && buffer_is_locked) { LockBuffer(buffer, BUFFER_LOCK_UNLOCK); } SegReleaseBuffer(buffer); @@ -1238,14 +1242,14 @@ Buffer XLogReadBufferExtendedForSegpage(const RelFileNode &rnode, ForkNumber for log_invalid_page(rnode, forknum, blkno, NOT_INITIALIZED, NULL); return InvalidBuffer; } + + if (ENABLE_DMS && buffer_is_locked) { + LockBuffer(buffer, BUFFER_LOCK_UNLOCK); + } } if (t_thrd.xlog_cxt.startup_processing && t_thrd.xlog_cxt.server_mode == STANDBY_MODE && PageIsLogical(page)) { PageClearLogical(page); } - - if (ENABLE_DMS) { - LockBuffer(buffer, BUFFER_LOCK_UNLOCK); - } } else { ereport(ERROR, (errcode_for_file_access(), errmsg("block is invalid %u/%u/%u %d %u", rnode.spcNode, rnode.dbNode, rnode.relNode,