diff --git a/src/gausskernel/storage/access/redo/redo_xlogutils.cpp b/src/gausskernel/storage/access/redo/redo_xlogutils.cpp index ccb0d153a1e5338817511a79ded30f20bf9a4407..7304e5412b6d24e43317ebedf58896251ccb7162 100644 --- a/src/gausskernel/storage/access/redo/redo_xlogutils.cpp +++ b/src/gausskernel/storage/access/redo/redo_xlogutils.cpp @@ -1705,36 +1705,35 @@ void ExtremeRtoFlushBuffer(RedoBufferInfo *bufferinfo, bool updateFsm) } /* release buffer */ XLogRedoBufferReleaseFunc(bufferinfo->buf); - } else { - if (bufferinfo->pageinfo.page != NULL) { - BufferDesc *bufDesc = GetBufferDescriptor(bufferinfo->buf - 1); + } else if (bufferinfo->pageinfo.page != NULL) { + BufferDesc *bufDesc = GetBufferDescriptor(bufferinfo->buf - 1); + if (bufferinfo->dirtyflag || XLByteLT(bufDesc->extra->lsn_on_disk, PageGetLSN(bufferinfo->pageinfo.page))) { /* backends may mark buffer dirty already */ - if (!(bufDesc->state & BM_DIRTY) && - (bufferinfo->dirtyflag || XLByteLT(bufDesc->extra->lsn_on_disk, PageGetLSN(bufferinfo->pageinfo.page)))) { + if (!(bufDesc->state & BM_DIRTY)) { MarkBufferDirty(bufferinfo->buf); - if (!bufferinfo->dirtyflag && bufferinfo->blockinfo.forknum == MAIN_FORKNUM) { - int mode = WARNING; + } + if (!bufferinfo->dirtyflag && bufferinfo->blockinfo.forknum == MAIN_FORKNUM) { + int mode = WARNING; #ifdef USE_ASSERT_CHECKING - mode = PANIC; + mode = PANIC; #endif - const uint32 shiftSz = 32; - ereport(mode, (errmsg("extreme_rto not mark dirty:lsn %X/%X, lsn_disk %X/%X, " - "lsn_page %X/%X, page %u/%u/%u %u", - (uint32)(bufferinfo->lsn >> shiftSz), (uint32)(bufferinfo->lsn), - (uint32)(bufDesc->extra->lsn_on_disk >> shiftSz), - (uint32)(bufDesc->extra->lsn_on_disk), - (uint32)(PageGetLSN(bufferinfo->pageinfo.page) >> shiftSz), - (uint32)(PageGetLSN(bufferinfo->pageinfo.page)), - bufferinfo->blockinfo.rnode.spcNode, bufferinfo->blockinfo.rnode.dbNode, - bufferinfo->blockinfo.rnode.relNode, bufferinfo->blockinfo.blkno))); - } + const uint32 shiftSz = 32; + ereport(mode, (errmsg("extreme_rto not mark dirty:lsn %X/%X, lsn_disk %X/%X, " + "lsn_page %X/%X, page %u/%u/%u %u", + (uint32)(bufferinfo->lsn >> shiftSz), (uint32)(bufferinfo->lsn), + (uint32)(bufDesc->extra->lsn_on_disk >> shiftSz), + (uint32)(bufDesc->extra->lsn_on_disk), + (uint32)(PageGetLSN(bufferinfo->pageinfo.page) >> shiftSz), + (uint32)(PageGetLSN(bufferinfo->pageinfo.page)), + bufferinfo->blockinfo.rnode.spcNode, bufferinfo->blockinfo.rnode.dbNode, + bufferinfo->blockinfo.rnode.relNode, bufferinfo->blockinfo.blkno))); + } #ifdef USE_ASSERT_CHECKING - bufDesc->lsn_dirty = PageGetLSN(bufferinfo->pageinfo.page); + bufDesc->lsn_dirty = PageGetLSN(bufferinfo->pageinfo.page); #endif - } - - UnlockReleaseBuffer(bufferinfo->buf); /* release buffer */ } + + UnlockReleaseBuffer(bufferinfo->buf); /* release buffer */ } SSMarkBufferDirtyForERTO(bufferinfo); diff --git a/src/gausskernel/storage/access/transam/extreme_rto/dispatcher.cpp b/src/gausskernel/storage/access/transam/extreme_rto/dispatcher.cpp index d920a34ce4b1d04cc604b610e6a971eb4bd62a14..dddd9eb47a1158fd3d0e74fbec2ee67d69ff6eeb 100755 --- a/src/gausskernel/storage/access/transam/extreme_rto/dispatcher.cpp +++ b/src/gausskernel/storage/access/transam/extreme_rto/dispatcher.cpp @@ -1775,6 +1775,9 @@ void SetLsnCheckInfo(uint64 curPosition, XLogRecPtr curLsn) bool CheckBufHasSpaceToDispatch(XLogRecPtr endRecPtr) { +#ifdef ENABLE_SS_MULTIMASTER + return true; +#endif uint64 curPosition; XLogRecPtr curLsn; GetLsnCheckInfo(&curPosition, &curLsn); diff --git a/src/gausskernel/storage/access/transam/extreme_rto/xlog_read.cpp b/src/gausskernel/storage/access/transam/extreme_rto/xlog_read.cpp index b0db5d75b2b6da00b3dd932b8882582c0230b693..dcaaf7155c1338043e4a3a332b60e6b3f3f7832b 100644 --- a/src/gausskernel/storage/access/transam/extreme_rto/xlog_read.cpp +++ b/src/gausskernel/storage/access/transam/extreme_rto/xlog_read.cpp @@ -84,8 +84,15 @@ XLogRecord *ReadNextXLogRecord(XLogReaderState **xlogreaderptr, int emode) if ((void *)xlogreader != (void *)&(g_redoEndMark.record)) { *xlogreaderptr = xlogreader; +#ifdef ENABLE_SS_MULTIMASTER + if (xlogreader->args == NULL || xlogreader->instId == SS_MY_INST_ID) { + t_thrd.xlog_cxt.ReadRecPtr = xlogreader->ReadRecPtr; + t_thrd.xlog_cxt.EndRecPtr = xlogreader->EndRecPtr; + } +#else t_thrd.xlog_cxt.ReadRecPtr = xlogreader->ReadRecPtr; t_thrd.xlog_cxt.EndRecPtr = xlogreader->EndRecPtr; +#endif record = (XLogRecord *)xlogreader->readRecordBuf; } else { *xlogreaderptr = &g_redoEndMark.record; diff --git a/src/gausskernel/storage/access/transam/multi_redo_api.cpp b/src/gausskernel/storage/access/transam/multi_redo_api.cpp index e357bc5a044588af2d7cef21b74b553661ba9484..d9da985597ba8d6110fa7fc63e3e497049f7d608 100644 --- a/src/gausskernel/storage/access/transam/multi_redo_api.cpp +++ b/src/gausskernel/storage/access/transam/multi_redo_api.cpp @@ -452,6 +452,11 @@ void DiagLogRedoRecord(XLogReaderState *record, const char *funcName) void ApplyRedoRecord(XLogReaderState *record) { +#ifdef ENABLE_SS_MULTIMASTER + if (record->args) { + NodeArgsSwitch(record->args); + } +#endif ErrorContextCallback errContext; errContext.callback = rm_redo_error_callback; errContext.arg = (void *)record; diff --git a/src/gausskernel/storage/access/transam/xlog.cpp b/src/gausskernel/storage/access/transam/xlog.cpp index 111bd8d1cd7d00034779b562b20bde1fb6822c91..7fe1430cacf94f6350abb5efa4ce09209dddf7dc 100755 --- a/src/gausskernel/storage/access/transam/xlog.cpp +++ b/src/gausskernel/storage/access/transam/xlog.cpp @@ -10794,6 +10794,9 @@ void StartupXLOG(void) } while (record != NULL); t_thrd.xlog_cxt.LastRec = t_thrd.xlog_cxt.ReadRecPtr; /* but need to wait SS_REDO_MODE */ + volatile XLogCtlData *xlogctl = t_thrd.shemem_ptr_cxt.XLogCtl; + xlogctl->IsRecoveryDone = true; + t_thrd.shemem_ptr_cxt.ControlFile->state = DB_IN_PRODUCTION; while (!g_instance.dms_cxt.SSRecoveryInfo.redo_done) { pg_usleep(5000L); } diff --git a/src/include/access/multi_redo_api.h b/src/include/access/multi_redo_api.h index aad30c1fd98a4a2046c113425f20d2d89e660373..877808aa3d510f9c3075f956eea74de13c47ee30 100644 --- a/src/include/access/multi_redo_api.h +++ b/src/include/access/multi_redo_api.h @@ -127,6 +127,7 @@ void StartUpMultiRedo(XLogReaderState* xlogreader, uint32 privateLen); #else void StartUpMultiRedo(XLogReaderState *xlogreader, XLogReaderState **xlogreaderList, int instanceNum, uint32 privateLen); void InitReaderStateByOld(XLogReaderState *newState, XLogReaderState *oldState); +void NodeArgsSwitch(XLogReaderArgs *args); #endif void ProcTxnWorkLoad(bool force);