diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c index 58f47e7b6466f35092edd3022a04690cbfc67e85..65354e6d28fa3accfcf989d79106984af87edce5 100644 --- a/src/backend/access/nbtree/nbtpage.c +++ b/src/backend/access/nbtree/nbtpage.c @@ -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; }