diff --git a/src/gausskernel/storage/access/transam/parallel_recovery/dispatcher.cpp b/src/gausskernel/storage/access/transam/parallel_recovery/dispatcher.cpp index e1dcd5b21..935dec338 100644 --- a/src/gausskernel/storage/access/transam/parallel_recovery/dispatcher.cpp +++ b/src/gausskernel/storage/access/transam/parallel_recovery/dispatcher.cpp @@ -356,6 +356,8 @@ static LogDispatcher *CreateDispatcher() newDispatcher->totalCostTime = 0; newDispatcher->txnCostTime = 0; newDispatcher->pprCostTime = 0; + newDispatcher->dispatchReadRecPtr = 0; + newDispatcher->dispatchEndRecPtr = 0; return newDispatcher; } @@ -551,6 +553,9 @@ void DispatchRedoRecordToFile(XLogReaderState *record, List *expectedTLIs, Times isNeedFullSync = true; } + g_dispatcher->dispatchReadRecPtr = record->ReadRecPtr; + g_dispatcher->dispatchEndRecPtr = record->EndRecPtr; + if (isNeedFullSync) ProcessPendingRecords(true); else if (++g_dispatcher->pendingCount >= g_dispatcher->pendingMax) diff --git a/src/gausskernel/storage/access/transam/parallel_recovery/txn_redo.cpp b/src/gausskernel/storage/access/transam/parallel_recovery/txn_redo.cpp index 50d73b368..e166c8318 100644 --- a/src/gausskernel/storage/access/transam/parallel_recovery/txn_redo.cpp +++ b/src/gausskernel/storage/access/transam/parallel_recovery/txn_redo.cpp @@ -293,9 +293,9 @@ void ApplyReadyTxnLogRecords(TxnRedoWorker *worker, bool forceAll) XLogRecPtr lrEnd; do { GetReplayedRecPtrFromWorkers(&lrRead, &lrEnd); - if (XLByteLT(t_thrd.xlog_cxt.EndRecPtr, lrEnd)) { - lrEnd = t_thrd.xlog_cxt.EndRecPtr; - lrRead = t_thrd.xlog_cxt.ReadRecPtr; + if (XLByteLT(g_dispatcher->dispatchEndRecPtr, lrEnd)) { + lrEnd = g_dispatcher->dispatchEndRecPtr; + lrRead = g_dispatcher->dispatchReadRecPtr; } if (!XLByteEQ(oldReplayedPageLSN, lrEnd)) { SetXLogReplayRecPtr(lrRead, lrEnd); diff --git a/src/include/access/parallel_recovery/dispatcher.h b/src/include/access/parallel_recovery/dispatcher.h index 70e7d3f6a..a481901fa 100644 --- a/src/include/access/parallel_recovery/dispatcher.h +++ b/src/include/access/parallel_recovery/dispatcher.h @@ -61,6 +61,8 @@ typedef struct LogDispatcher { uint32* chosedWorkerIds; uint32 chosedWorkerCount; uint32 readyWorkerCnt; + XLogRecPtr dispatchReadRecPtr; /* start of dispatch record read */ + XLogRecPtr dispatchEndRecPtr; /* end of dispatch record read */ bool checkpointNeedFullSync; } LogDispatcher;