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,