]> granicus.if.org Git - postgresql/commitdiff
Respect Hot Standby controls while recycling btree index pages.
authorSimon Riggs <simon@2ndQuadrant.com>
Thu, 16 Jun 2011 09:19:10 +0000 (10:19 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Thu, 16 Jun 2011 09:19:10 +0000 (10:19 +0100)
Btree pages were recycled after VACUUM deletes all records on a
page and then a subsequent VACUUM occurs after the RecentXmin
horizon is reached. Using RecentXmin meant that we did not respond
correctly to the user controls provide to avoid Hot Standby
conflicts and so spurious conflicts could be generated in some
workload combinations. We now reuse pages only when we reach
RecentGlobalXmin, which can be much later in the presence of long
running queries and is also controlled by vacuum_defer_cleanup_age
and hot_standby_feedback.

Noah Misch and Simon Riggs

src/backend/access/nbtree/nbtpage.c

index 58f47e7b6466f35092edd3022a04690cbfc67e85..65354e6d28fa3accfcf989d79106984af87edce5 100644 (file)
@@ -677,6 +677,7 @@ bool
 _bt_page_recyclable(Page page)
 {
        BTPageOpaque opaque;
+       TransactionId cutoff;
 
        /*
         * It's possible to find an all-zeroes page in an index --- for example, a
@@ -689,11 +690,18 @@ _bt_page_recyclable(Page page)
 
        /*
         * Otherwise, recycle if deleted and too old to have any processes
-        * interested in it.
+        * interested in it.  If we are generating records for Hot Standby
+        * defer page recycling until RecentGlobalXmin to respect user
+        * controls specified by vacuum_defer_cleanup_age or hot_standby_feedback.
         */
+       if (XLogStandbyInfoActive())
+               cutoff = RecentGlobalXmin;
+       else
+               cutoff = RecentXmin;
+
        opaque = (BTPageOpaque) PageGetSpecialPointer(page);
        if (P_ISDELETED(opaque) &&
-               TransactionIdPrecedesOrEquals(opaque->btpo.xact, RecentXmin))
+               TransactionIdPrecedesOrEquals(opaque->btpo.xact, cutoff))
                return true;
        return false;
 }