解决延迟回放同时remoteapply时不阻塞的问题

This commit is contained in:
MuJinqiang
2021-03-08 22:52:11 +08:00
parent df22f91ed5
commit 016401c6eb
3 changed files with 10 additions and 3 deletions

View File

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

View File

@ -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);

View File

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