On 27/06/15 01:13, Jim Nasby wrote: > On 6/26/15 8:50 AM, Marco Nenciarini wrote: >>> >In the heap_xlog_freeze we need to subtract one to the value of >>> cutoff_xid >>> >before passing it to ResolveRecoveryConflictWithSnapshot. >>> > >>> > >>> > >> Attached a proposed patch that solves the issue. >
I have hit the bug again, as it has been fixed only from 9.5+ The procedure to reproduce it sent in the original post is not fully accurate, below there is one that always works: Run the following operation on an idle cluster. 1) connect to the master and run the following script create table t(id int primary key); insert into t select generate_series(1, 10000); 2) connect to the standby and simulate a long running query: select pg_sleep(3600); 3) on the master and run the following commands: vacuum freeze verbose t; drop table t; 4) after 30 seconds the pg_sleep query on standby will be canceled. Attached there is a patch that apply on every version that misses the fix (9.0, 9.1, 9.2, 9.3, 9.4) Regards, Marco -- Marco Nenciarini - 2ndQuadrant Italy PostgreSQL Training, Services and Support [email protected] | www.2ndQuadrant.it
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c
index eb8eada..434880a 100644
--- a/src/backend/access/heap/heapam.c
+++ b/src/backend/access/heap/heapam.c
@@ -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))
signature.asc
Description: OpenPGP digital signature
