commit 62b447282d7436642984005627f966f93f4a2439 Author: Anton A. Melnikov Date: Tue Sep 6 12:18:56 2022 +0300 Remove burst growth of the checkpoint_req on replica. diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 7a710e6490..0c7510bca5 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -8880,3 +8880,24 @@ SetWalWriterSleeping(bool sleeping) XLogCtl->WalWriterSleeping = sleeping; SpinLockRelease(&XLogCtl->info_lck); } + +/* + * Update the WalWriterSleeping flag. + */ +bool IsNewCheckpointWALRecs(void) +{ + bool result = false; + /* + * Get the last safe checkpoint record and check if + * there is a new checkpoint WAL records since the + * last restartpoint. + */ + SpinLockAcquire(&XLogCtl->info_lck); + if (!XLogRecPtrIsInvalid(XLogCtl->lastCheckPointRecPtr) + && XLogCtl->lastCheckPoint.redo > + ControlFile->checkPointCopy.redo) + result = true; + SpinLockRelease(&XLogCtl->info_lck); + + return result; +} diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index ae2af5ae3d..2502e4f726 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -3194,7 +3194,15 @@ XLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, int reqLen, { (void) GetRedoRecPtr(); if (XLogCheckpointNeeded(readSegNo)) - RequestCheckpoint(CHECKPOINT_CAUSE_XLOG); + { + /* + * If there is no new checkpoint WAL records since the + * last restartpoint the creation of new one + * will certainly fail, so skip it. + */ + if (IsNewCheckpointWALRecs()) + RequestCheckpoint(CHECKPOINT_CAUSE_XLOG); + } } } diff --git a/src/include/access/xlogrecovery.h b/src/include/access/xlogrecovery.h index 0aa85d90e8..d1431ab9b0 100644 --- a/src/include/access/xlogrecovery.h +++ b/src/include/access/xlogrecovery.h @@ -82,6 +82,7 @@ extern void XLogRecoveryShmemInit(void); extern void InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdownPtr, bool *haveBackupLabel, bool *haveTblspcMap); extern void PerformWalRecovery(void); +extern bool IsNewCheckpointWALRecs(void); /* * FinishWalRecovery() returns this. It contains information about the point