aboutsummaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
Diffstat (limited to 'src/include')
-rw-r--r--src/include/access/heapam.h10
-rw-r--r--src/include/access/tableam.h2
-rw-r--r--src/include/commands/vacuum.h49
3 files changed, 48 insertions, 13 deletions
diff --git a/src/include/access/heapam.h b/src/include/access/heapam.h
index 810baaf9d08..53eb011766b 100644
--- a/src/include/access/heapam.h
+++ b/src/include/access/heapam.h
@@ -38,6 +38,7 @@
typedef struct BulkInsertStateData *BulkInsertState;
struct TupleTableSlot;
+struct VacuumCutoffs;
#define MaxLockTupleMode LockTupleExclusive
@@ -178,8 +179,7 @@ extern TM_Result heap_lock_tuple(Relation relation, HeapTuple tuple,
extern void heap_inplace_update(Relation relation, HeapTuple tuple);
extern bool heap_prepare_freeze_tuple(HeapTupleHeader tuple,
- TransactionId relfrozenxid, TransactionId relminmxid,
- TransactionId cutoff_xid, TransactionId cutoff_multi,
+ const struct VacuumCutoffs *cutoffs,
HeapTupleFreeze *frz, bool *totally_frozen,
TransactionId *relfrozenxid_out,
MultiXactId *relminmxid_out);
@@ -188,9 +188,9 @@ extern void heap_freeze_execute_prepared(Relation rel, Buffer buffer,
HeapTupleFreeze *tuples, int ntuples);
extern bool heap_freeze_tuple(HeapTupleHeader tuple,
TransactionId relfrozenxid, TransactionId relminmxid,
- TransactionId cutoff_xid, TransactionId cutoff_multi);
-extern bool heap_tuple_would_freeze(HeapTupleHeader tuple, TransactionId cutoff_xid,
- MultiXactId cutoff_multi,
+ TransactionId FreezeLimit, TransactionId MultiXactCutoff);
+extern bool heap_tuple_would_freeze(HeapTupleHeader tuple,
+ const struct VacuumCutoffs *cutoffs,
TransactionId *relfrozenxid_out,
MultiXactId *relminmxid_out);
extern bool heap_tuple_needs_eventual_freeze(HeapTupleHeader tuple);
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h
index 4d1ef405c22..1320ee6db66 100644
--- a/src/include/access/tableam.h
+++ b/src/include/access/tableam.h
@@ -1634,7 +1634,7 @@ table_relation_copy_data(Relation rel, const RelFileLocator *newrlocator)
* in that index's order; if false and OldIndex is InvalidOid, no sorting is
* performed
* - OldIndex - see use_sort
- * - OldestXmin - computed by vacuum_set_xid_limits(), even when
+ * - OldestXmin - computed by vacuum_get_cutoffs(), even when
* not needed for the relation's AM
* - *xid_cutoff - ditto
* - *multi_cutoff - ditto
diff --git a/src/include/commands/vacuum.h b/src/include/commands/vacuum.h
index 4e4bc26a8bf..2f274f2bec3 100644
--- a/src/include/commands/vacuum.h
+++ b/src/include/commands/vacuum.h
@@ -236,6 +236,45 @@ typedef struct VacuumParams
} VacuumParams;
/*
+ * VacuumCutoffs is immutable state that describes the cutoffs used by VACUUM.
+ * Established at the beginning of each VACUUM operation.
+ */
+struct VacuumCutoffs
+{
+ /*
+ * Existing pg_class fields at start of VACUUM
+ */
+ TransactionId relfrozenxid;
+ MultiXactId relminmxid;
+
+ /*
+ * OldestXmin is the Xid below which tuples deleted by any xact (that
+ * committed) should be considered DEAD, not just RECENTLY_DEAD.
+ *
+ * OldestMxact is the Mxid below which MultiXacts are definitely not seen
+ * as visible by any running transaction.
+ *
+ * OldestXmin and OldestMxact are also the most recent values that can
+ * ever be passed to vac_update_relstats() as frozenxid and minmulti
+ * arguments at the end of VACUUM. These same values should be passed
+ * when it turns out that VACUUM will leave no unfrozen XIDs/MXIDs behind
+ * in the table.
+ */
+ TransactionId OldestXmin;
+ MultiXactId OldestMxact;
+
+ /*
+ * FreezeLimit is the Xid below which all Xids are definitely frozen or
+ * removed in pages VACUUM scans and cleanup locks.
+ *
+ * MultiXactCutoff is the value below which all MultiXactIds are
+ * definitely removed from Xmax in pages VACUUM scans and cleanup locks.
+ */
+ TransactionId FreezeLimit;
+ MultiXactId MultiXactCutoff;
+};
+
+/*
* VacDeadItems stores TIDs whose index tuples are deleted by index vacuuming.
*/
typedef struct VacDeadItems
@@ -286,13 +325,9 @@ extern void vac_update_relstats(Relation relation,
bool *frozenxid_updated,
bool *minmulti_updated,
bool in_outer_xact);
-extern bool vacuum_set_xid_limits(Relation rel, const VacuumParams *params,
- TransactionId *OldestXmin,
- MultiXactId *OldestMxact,
- TransactionId *FreezeLimit,
- MultiXactId *MultiXactCutoff);
-extern bool vacuum_xid_failsafe_check(TransactionId relfrozenxid,
- MultiXactId relminmxid);
+extern bool vacuum_get_cutoffs(Relation rel, const VacuumParams *params,
+ struct VacuumCutoffs *cutoffs);
+extern bool vacuum_xid_failsafe_check(const struct VacuumCutoffs *cutoffs);
extern void vac_update_datfrozenxid(void);
extern void vacuum_delay_point(void);
extern bool vacuum_is_permitted_for_relation(Oid relid, Form_pg_class reltuple,