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 marco.nenciar...@2ndquadrant.it | 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