From 30af16969f6244ff1381d607ae4bde9b78c867d0 Mon Sep 17 00:00:00 2001 From: jiwenke Date: Thu, 27 Jun 2024 13:58:24 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8DControlFile=E7=BD=AE?= =?UTF-8?q?=E4=BD=8D=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/gausskernel/storage/access/transam/xlog.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/gausskernel/storage/access/transam/xlog.cpp b/src/gausskernel/storage/access/transam/xlog.cpp index 111bd8d1c..7fe1430ca 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); } -- Gitee From 1c73e46a7c445aff5208d16899b0bda9117c2ba9 Mon Sep 17 00:00:00 2001 From: jiwenke Date: Thu, 27 Jun 2024 13:59:37 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9E=81=E8=87=B4rto=20b?= =?UTF-8?q?ug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../storage/access/redo/redo_xlogutils.cpp | 45 +++++++++---------- .../access/transam/extreme_rto/dispatcher.cpp | 3 ++ .../access/transam/extreme_rto/xlog_read.cpp | 7 +++ .../storage/access/transam/multi_redo_api.cpp | 5 +++ src/include/access/multi_redo_api.h | 1 + 5 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/gausskernel/storage/access/redo/redo_xlogutils.cpp b/src/gausskernel/storage/access/redo/redo_xlogutils.cpp index ccb0d153a..7304e5412 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 d920a34ce..dddd9eb47 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 b0db5d75b..dcaaf7155 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 e357bc5a0..d9da98559 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/include/access/multi_redo_api.h b/src/include/access/multi_redo_api.h index aad30c1fd..877808aa3 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); -- Gitee