avoid_Extra_WAL_checkpoint.patch
application/octet-stream
Filename: avoid_Extra_WAL_checkpoint.patch
Type: application/octet-stream
Part: 0
Patch
Format: context
| File | + | − |
|---|---|---|
| src/backend/access/transam/xlog.c | 17 | 0 |
*** a/src/backend/access/transam/xlog.c
--- b/src/backend/access/transam/xlog.c
***************
*** 7084,7094 **** CreateCheckPoint(int flags)
CHECKPOINT_FORCE)) == 0)
{
XLogRecPtr curInsert;
INSERT_RECPTR(curInsert, Insert, Insert->curridx);
if (curInsert == ControlFile->checkPoint +
MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
! ControlFile->checkPoint == ControlFile->checkPointCopy.redo)
{
LWLockRelease(WALInsertLock);
LWLockRelease(CheckpointLock);
--- 7084,7110 ----
CHECKPOINT_FORCE)) == 0)
{
XLogRecPtr curInsert;
+ uint32 runningXactXLog = 0;
+ /*
+ * Take the size of RUNNING XACT XLOG, only if HOT STANDBY is enabled.
+ * Because if it is not enabled, then RUNNING XACT XLOG is not logged.
+ */
+ if (!shutdown && XLogStandbyInfoActive())
+ {
+ runningXactXLog = MAXALIGN(MinSizeOfXactRunningXacts) + SizeOfXLogRecord;
+ }
+
+ /*
+ * ControlFile->checkPointCopy.redo points to the offset before
+ * RUNNING XACT XLOG was inserted but ControlFile->checkPoint
+ * points to the offset after insertion, so we should add size of RUNNING XACT XLOG
+ * to check if any other new XLOG has been inserted
+ */
INSERT_RECPTR(curInsert, Insert, Insert->curridx);
if (curInsert == ControlFile->checkPoint +
MAXALIGN(SizeOfXLogRecord + sizeof(CheckPoint)) &&
! ControlFile->checkPoint == ControlFile->checkPointCopy.redo + runningXactXLog)
{
LWLockRelease(WALInsertLock);
LWLockRelease(CheckpointLock);