修复回放过程中遇到read mode是zero and lock导致的反复上锁
This commit is contained in:
committed by
dongning12
parent
65cb922a07
commit
490edec3ee
@ -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,
|
||||
|
||||
Reference in New Issue
Block a user