]> granicus.if.org Git - postgresql/commitdiff
Truncate subtrans after each restartpoint.
authorSimon Riggs <simon@2ndQuadrant.com>
Mon, 30 Aug 2010 14:22:05 +0000 (14:22 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Mon, 30 Aug 2010 14:22:05 +0000 (14:22 +0000)
Issue reported by Harald Kolb, patch by Fujii Masao, review by me.

src/backend/access/transam/xlog.c

index 617895c147ae6054579e73681070aec3a13e1d8e..fd7f20546680a93e909a0df1414f30884bfa211e 100644 (file)
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.432 2010/08/26 19:23:41 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.433 2010/08/30 14:22:05 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -7706,10 +7706,14 @@ CreateRestartPoint(int flags)
        }
 
        /*
-        * Currently, there is no need to truncate pg_subtrans during recovery. If
-        * we did do that, we will need to have called StartupSUBTRANS() already
-        * and then TruncateSUBTRANS() would go here.
+        * Truncate pg_subtrans if possible.  We can throw away all data before
+        * the oldest XMIN of any running transaction.  No future transaction will
+        * attempt to reference any pg_subtrans entry older than that (see Asserts
+        * in subtrans.c).      When hot standby is disabled, though, we mustn't do
+        * this because StartupSUBTRANS hasn't been called yet.
         */
+       if (EnableHotStandby)
+               TruncateSUBTRANS(GetOldestXmin(true, false));
 
        /* All real work is done, but log before releasing lock. */
        if (log_checkpoints)