Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Fix timing of Startup CLOG and MultiXact during Hot Standby
authorSimon Riggs <simon@2ndQuadrant.com>
Wed, 2 Nov 2011 08:06:54 +0000 (08:06 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Wed, 2 Nov 2011 08:06:54 +0000 (08:06 +0000)
Patch by me, bug report by Chris Redekop, analysis by Florian Pflug

src/backend/access/transam/clog.c
src/backend/access/transam/multixact.c
src/backend/access/transam/xlog.c
src/include/access/clog.h

index d3de8934eee15879af3d2258b29d452a39cc33d5..34258ec5582fb009169a21f0bc07ffc0d8ec02ef 100644 (file)
@@ -490,6 +490,25 @@ StartupCLOG(void)
     */
    ClogCtl->shared->latest_page_number = pageno;
 
+   LWLockRelease(CLogControlLock);
+}
+
+/*
+ * This must be called ONCE at the end of startup/recovery.
+ */
+void
+TrimCLOG(void)
+{
+   TransactionId xid = ShmemVariableCache->nextXid;
+   int         pageno = TransactionIdToPage(xid);
+
+   LWLockAcquire(CLogControlLock, LW_EXCLUSIVE);
+
+   /*
+    * Re-Initialize our idea of the latest page number.
+    */
+   ClogCtl->shared->latest_page_number = pageno;
+
    /*
     * Zero out the remainder of the current clog page.  Under normal
     * circumstances it should be zeroes already, but it seems at least
index bb3afd6000c35cb576809a8feff4b6692d2c32c0..f0396726201792edef47a3605c0088733516f258 100644 (file)
@@ -1568,7 +1568,7 @@ StartupMultiXact(void)
 
    /*
     * Zero out the remainder of the current members page.  See notes in
-    * StartupCLOG() for motivation.
+    * TrimCLOG() for motivation.
     */
    entryno = MXOffsetToMemberEntry(offset);
    if (entryno != 0)
index 633450fbc7b68397c21dc817576a9abce6b3888f..60ea3f7f1ed651450c2e2fd252ed897112157a00 100644 (file)
@@ -6384,10 +6384,12 @@ StartupXLOG(void)
                oldestActiveXID = checkPoint.oldestActiveXid;
            Assert(TransactionIdIsValid(oldestActiveXID));
 
-           /* Startup commit log and related stuff */
+           /*
+            * Startup commit log and subtrans only. Other SLRUs are not
+            * maintained during recovery and need not be started yet.
+            */
            StartupCLOG();
            StartupSUBTRANS(oldestActiveXID);
-           StartupMultiXact();
 
            /*
             * If we're beginning at a shutdown checkpoint, we know that
@@ -6876,16 +6878,21 @@ StartupXLOG(void)
    TransactionIdRetreat(ShmemVariableCache->latestCompletedXid);
 
    /*
-    * Start up the commit log and related stuff, too. In hot standby mode we
-    * did this already before WAL replay.
+    * Start up the commit log and subtrans, if not already done for
+    * hot standby.
     */
    if (standbyState == STANDBY_DISABLED)
    {
        StartupCLOG();
        StartupSUBTRANS(oldestActiveXID);
-       StartupMultiXact();
    }
 
+   /*
+    * Perform end of recovery actions for any SLRUs that need it.
+    */
+   StartupMultiXact();
+   TrimCLOG();
+
    /* Reload shared-memory state for prepared transactions */
    RecoverPreparedTransactions();
 
index 7a8918e0fc56975043faa65b0a5ef28a39d37ccf..691430c97ca191a870e00cd0115b82f1e7ac125e 100644 (file)
@@ -40,6 +40,7 @@ extern Size CLOGShmemSize(void);
 extern void CLOGShmemInit(void);
 extern void BootStrapCLOG(void);
 extern void StartupCLOG(void);
+extern void TrimCLOG(void);
 extern void ShutdownCLOG(void);
 extern void CheckPointCLOG(void);
 extern void ExtendCLOG(TransactionId newestXact);