Page page;
BlockNumber block;
Buffer buffer;
- TransactionId prune_xid;
Assert(ItemPointerIsValid(tid));
* TransactionXmin, so there's no race here).
*/
Assert(TransactionIdIsValid(TransactionXmin));
- if (TransactionIdPrecedes(TransactionXmin, relation->rd_rel->relfrozenxid))
- prune_xid = relation->rd_rel->relfrozenxid;
- else
- prune_xid = TransactionXmin;
- PageSetPrunable(page, prune_xid);
+ {
+ TransactionId relfrozenxid = relation->rd_rel->relfrozenxid;
+ TransactionId prune_xid;
+
+ if (TransactionIdPrecedes(TransactionXmin, relfrozenxid))
+ prune_xid = relfrozenxid;
+ else
+ prune_xid = TransactionXmin;
+ PageSetPrunable(page, prune_xid);
+ }
/* store transaction information of xact deleting the tuple */
tp.t_data->t_infomask &= ~(HEAP_XMAX_BITS | HEAP_MOVED);
* FreezeXid will become the table's new relfrozenxid, and that mustn't go
* backwards, so take the max.
*/
- if (TransactionIdIsValid(OldHeap->rd_rel->relfrozenxid) &&
- TransactionIdPrecedes(cutoffs.FreezeLimit,
- OldHeap->rd_rel->relfrozenxid))
- cutoffs.FreezeLimit = OldHeap->rd_rel->relfrozenxid;
+ {
+ TransactionId relfrozenxid = OldHeap->rd_rel->relfrozenxid;
+
+ if (TransactionIdIsValid(relfrozenxid) &&
+ TransactionIdPrecedes(cutoffs.FreezeLimit, relfrozenxid))
+ cutoffs.FreezeLimit = relfrozenxid;
+ }
/*
* MultiXactCutoff, similarly, shouldn't go backwards either.
*/
- if (MultiXactIdIsValid(OldHeap->rd_rel->relminmxid) &&
- MultiXactIdPrecedes(cutoffs.MultiXactCutoff,
- OldHeap->rd_rel->relminmxid))
- cutoffs.MultiXactCutoff = OldHeap->rd_rel->relminmxid;
+ {
+ MultiXactId relminmxid = OldHeap->rd_rel->relminmxid;
+
+ if (MultiXactIdIsValid(relminmxid) &&
+ MultiXactIdPrecedes(cutoffs.MultiXactCutoff, relminmxid))
+ cutoffs.MultiXactCutoff = relminmxid;
+ }
/*
* Decide whether to use an indexscan or seqscan-and-optional-sort to scan
aggressiveXIDCutoff = nextXID - freeze_table_age;
if (!TransactionIdIsNormal(aggressiveXIDCutoff))
aggressiveXIDCutoff = FirstNormalTransactionId;
- if (TransactionIdPrecedesOrEquals(rel->rd_rel->relfrozenxid,
+ if (TransactionIdPrecedesOrEquals(cutoffs->relfrozenxid,
aggressiveXIDCutoff))
return true;
aggressiveMXIDCutoff = nextMXID - multixact_freeze_table_age;
if (aggressiveMXIDCutoff < FirstMultiXactId)
aggressiveMXIDCutoff = FirstMultiXactId;
- if (MultiXactIdPrecedesOrEquals(rel->rd_rel->relminmxid,
+ if (MultiXactIdPrecedesOrEquals(cutoffs->relminmxid,
aggressiveMXIDCutoff))
return true;
int freeze_max_age;
int multixact_freeze_max_age;
TransactionId xidForceLimit;
+ TransactionId relfrozenxid;
MultiXactId multiForceLimit;
Assert(classForm != NULL);
xidForceLimit = recentXid - freeze_max_age;
if (xidForceLimit < FirstNormalTransactionId)
xidForceLimit -= FirstNormalTransactionId;
- force_vacuum = (TransactionIdIsNormal(classForm->relfrozenxid) &&
- TransactionIdPrecedes(classForm->relfrozenxid,
- xidForceLimit));
+ relfrozenxid = classForm->relfrozenxid;
+ force_vacuum = (TransactionIdIsNormal(relfrozenxid) &&
+ TransactionIdPrecedes(relfrozenxid, xidForceLimit));
if (!force_vacuum)
{
+ MultiXactId relminmxid = classForm->relminmxid;
+
multiForceLimit = recentMulti - multixact_freeze_max_age;
if (multiForceLimit < FirstMultiXactId)
multiForceLimit -= FirstMultiXactId;
- force_vacuum = MultiXactIdIsValid(classForm->relminmxid) &&
- MultiXactIdPrecedes(classForm->relminmxid, multiForceLimit);
+ force_vacuum = MultiXactIdIsValid(relminmxid) &&
+ MultiXactIdPrecedes(relminmxid, multiForceLimit);
}
*wraparound = force_vacuum;