diff options
Diffstat (limited to 'src/backend/access/heap')
| -rw-r--r-- | src/backend/access/heap/heapam.c | 31 | ||||
| -rw-r--r-- | src/backend/access/heap/pruneheap.c | 1 |
2 files changed, 23 insertions, 9 deletions
diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 48a387e2ecb..1c934007b2e 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -3776,8 +3776,11 @@ heap_restrpos(HeapScanDesc scan) } /* - * If 'tuple' contains any XID greater than latestRemovedXid, update - * latestRemovedXid to the greatest one found. + * If 'tuple' contains any visible XID greater than latestRemovedXid, + * ratchet forwards latestRemovedXid to the greatest one found. + * This is used as the basis for generating Hot Standby conflicts, so + * if a tuple was never visible then removing it should not conflict + * with queries. */ void HeapTupleHeaderAdvanceLatestRemovedXid(HeapTupleHeader tuple, @@ -3793,13 +3796,25 @@ HeapTupleHeaderAdvanceLatestRemovedXid(HeapTupleHeader tuple, *latestRemovedXid = xvac; } - if (TransactionIdPrecedes(*latestRemovedXid, xmax)) - *latestRemovedXid = xmax; - - if (TransactionIdPrecedes(*latestRemovedXid, xmin)) - *latestRemovedXid = xmin; + /* + * Ignore tuples inserted by an aborted transaction or + * if the tuple was updated/deleted by the inserting transaction. + * + * Look for a committed hint bit, or if no xmin bit is set, check clog. + * This needs to work on both master and standby, where it is used + * to assess btree delete records. + */ + if ((tuple->t_infomask & HEAP_XMIN_COMMITTED) || + (!(tuple->t_infomask & HEAP_XMIN_COMMITTED) && + !(tuple->t_infomask & HEAP_XMIN_INVALID) && + TransactionIdDidCommit(xmin))) + { + if (xmax != xmin && + TransactionIdFollows(xmax, *latestRemovedXid)) + *latestRemovedXid = xmax; + } - Assert(TransactionIdIsValid(*latestRemovedXid)); + /* *latestRemovedXid may still be invalid at end */ } /* diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index 3332e085b83..6d72bb27659 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -237,7 +237,6 @@ heap_page_prune(Relation relation, Buffer buffer, TransactionId OldestXmin, { XLogRecPtr recptr; - Assert(TransactionIdIsValid(prstate.latestRemovedXid)); recptr = log_heap_clean(relation, buffer, prstate.redirected, prstate.nredirected, prstate.nowdead, prstate.ndead, |
