Don't try to truncate multixact SLRU files in checkpoints done during xlog
authorTom Lane <[email protected]>
Thu, 20 Jul 2006 00:46:56 +0000 (00:46 +0000)
committerTom Lane <[email protected]>
Thu, 20 Jul 2006 00:46:56 +0000 (00:46 +0000)
recovery.  In the first place, it doesn't work because slru's
latest_page_number isn't set up yet (this is why we've been hearing reports
of strange "apparent wraparound" log messages during crash recovery, but
only from people who'd managed to advance their next-mxact counters some
considerable distance from 0).  In the second place, it seems a bit unwise
to be throwing away data during crash recovery anwyway.  This latter
consideration convinces me to just disable truncation during recovery,
rather than computing latest_page_number and pushing ahead.

src/backend/access/transam/multixact.c

index b139d6beef17acc11e9c288ef9ed1a689c5b37c2..fedc8dcb17ce5797e82bdf59b2cb90e7e4b80bed 100644 (file)
@@ -1490,9 +1490,14 @@ CheckPointMultiXact(void)
 
        /*
         * Truncate the SLRU files.  This could be done at any time, but
-        * checkpoint seems a reasonable place for it.
+        * checkpoint seems a reasonable place for it.  There is one exception:
+        * if we are called during xlog recovery, then shared->latest_page_number
+        * isn't valid (because StartupMultiXact hasn't been called yet) and
+        * so SimpleLruTruncate would get confused.  It seems best not to risk
+        * removing any data during recovery anyway, so don't truncate.
         */
-       TruncateMultiXact();
+       if (!InRecovery)
+               TruncateMultiXact();
 }
 
 /*