]> granicus.if.org Git - postgresql/commitdiff
Initialize shared memory copy of ckptXidEpoch correctly when not in recovery.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 29 Jun 2012 16:19:29 +0000 (19:19 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 29 Jun 2012 16:23:04 +0000 (19:23 +0300)
This bug was introduced by commit 20d98ab6e4110087d1816cd105a40fcc8ce0a307,
so backpatch this to 9.0-9.2 like that one.

This fixes bug #6710, reported by Tarvi Pillessaar

src/backend/access/transam/xlog.c

index 0d68760e81260373f4fc077895e4c986a26e5bc7..ca17319c8c89b5ac6b0eb2dae5b97a23edb921da 100644 (file)
@@ -6249,11 +6249,14 @@ StartupXLOG(void)
                ereport(PANIC,
                                (errmsg("invalid next transaction ID")));
 
+       /* initialize shared memory variables from the checkpoint record */
        ShmemVariableCache->nextXid = checkPoint.nextXid;
        ShmemVariableCache->nextOid = checkPoint.nextOid;
        ShmemVariableCache->oidCount = 0;
        MultiXactSetNextMXact(checkPoint.nextMulti, checkPoint.nextMultiOffset);
        SetTransactionIdLimit(checkPoint.oldestXid, checkPoint.oldestXidDB);
+       XLogCtl->ckptXidEpoch = checkPoint.nextXidEpoch;
+       XLogCtl->ckptXid = checkPoint.nextXid;
 
        /*
         * We must replay WAL entries using the same TimeLineID they were created
@@ -6352,10 +6355,6 @@ StartupXLOG(void)
                /* No need to hold ControlFileLock yet, we aren't up far enough */
                UpdateControlFile();
 
-               /* initialize shared-memory copy of latest checkpoint XID/epoch */
-               XLogCtl->ckptXidEpoch = ControlFile->checkPointCopy.nextXidEpoch;
-               XLogCtl->ckptXid = ControlFile->checkPointCopy.nextXid;
-
                /* initialize our local copy of minRecoveryPoint */
                minRecoveryPoint = ControlFile->minRecoveryPoint;