Avoid hot standby cancels from VAC FREEZE
authorAlvaro Herrera <[email protected]>
Wed, 25 May 2016 23:39:49 +0000 (19:39 -0400)
committerAlvaro Herrera <[email protected]>
Wed, 25 May 2016 23:39:49 +0000 (19:39 -0400)
VACUUM FREEZE generated false cancelations of standby queries on an
otherwise idle master. Caused by an off-by-one error on cutoff_xid
which goes back to original commit.

Analysis and report by Marco Nenciarini

Bug fix by Simon Riggs

This is a correct backpatch of commit 66fbcb0d2e to branches 9.1 through
9.4.  That commit was backpatched to 9.0 originally, but it was
immediately reverted in 9.0-9.4 because it didn't compile.

src/backend/access/heap/heapam.c

index eb8eada27d6ed1a0aebc33447176d392b6f1eb1d..434880ac295eaf4862f0a4927817c6f5af33526d 100644 (file)
@@ -4764,7 +4764,13 @@ heap_xlog_freeze(XLogRecPtr lsn, XLogRecord *record)
     * consider the frozen xids as running.
     */
    if (InHotStandby)
-       ResolveRecoveryConflictWithSnapshot(cutoff_xid, xlrec->node);
+   {
+       TransactionId latestRemovedXid = cutoff_xid;
+
+       TransactionIdRetreat(latestRemovedXid);
+
+       ResolveRecoveryConflictWithSnapshot(latestRemovedXid, xlrec->node);
+   }
 
    /* If we have a full-page image, restore it and we're done */
    if (record->xl_info & XLR_BKP_BLOCK(0))