diff --git a/src/backend/access/heap/pruneheap.c b/src/backend/access/heap/pruneheap.c index 3ec10a07c02cf2cff0419527f4ab45548470eef3..fdfa37c39c41c6c0218c1e916b0602c909e4caee 100644 --- a/src/backend/access/heap/pruneheap.c +++ b/src/backend/access/heap/pruneheap.c @@ -479,13 +479,22 @@ heap_prune_chain(Relation relation, Buffer buffer, OffsetNumber rootoffnum, break; case HEAPTUPLE_DELETE_IN_PROGRESS: + { + TransactionId xmax; + + /* + * This tuple may soon become DEAD. Update the hint field + * so that the page is reconsidered for pruning in future. + * If there was a MultiXactId updater, and it aborted after + * HTSV checked, then we will get an invalid Xid here. + * There is no need for future pruning of the page in that + * case, so skip it. + */ + xmax = HeapTupleHeaderGetUpdateXid(htup); + if (TransactionIdIsValid(xmax)) + heap_prune_record_prunable(prstate, xmax); + } - /* - * This tuple may soon become DEAD. Update the hint field so - * that the page is reconsidered for pruning in future. - */ - heap_prune_record_prunable(prstate, - HeapTupleHeaderGetUpdateXid(htup)); break; case HEAPTUPLE_LIVE: