修复回放过程中遇到read mode是zero and lock导致的反复上锁

This commit is contained in:
arcoalien@qq.com
2023-03-22 20:08:55 +08:00
committed by dongning12
parent 65cb922a07
commit 490edec3ee

View File

@ -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,