aboutsummaryrefslogtreecommitdiff
path: root/src/backend/commands/cluster.c
diff options
context:
space:
mode:
authorPeter Geoghegan <pg@bowt.ie>2022-12-22 09:37:59 -0800
committerPeter Geoghegan <pg@bowt.ie>2022-12-22 09:37:59 -0800
commit4ce3afb82ecfbf64d4f6247e725004e1da30f47c (patch)
treebee5ce2942c24110262039543dca87b66ff6a914 /src/backend/commands/cluster.c
parente42e312430279dcd8947846fdfeb4885e3754eac (diff)
downloadpostgresql-4ce3afb82ecfbf64d4f6247e725004e1da30f47c.tar.gz
postgresql-4ce3afb82ecfbf64d4f6247e725004e1da30f47c.zip
Refactor how VACUUM passes around its XID cutoffs.
Use a dedicated struct for the XID/MXID cutoffs used by VACUUM, such as FreezeLimit and OldestXmin. This state is initialized in vacuum.c, and then passed around by code from vacuumlazy.c to heapam.c freezing related routines. The new convention is that everybody works off of the same cutoff state, which is passed around via pointers to const. Also simplify some of the logic for dealing with frozen xmin in heap_prepare_freeze_tuple: add dedicated "xmin_already_frozen" state to clearly distinguish xmin XIDs that we're going to freeze from those that were already frozen from before. That way the routine's xmin handling code is symmetrical with the existing xmax handling code. This is preparation for an upcoming commit that will add page level freezing. Also refactor the control flow within FreezeMultiXactId(), while adding stricter sanity checks. We now test OldestXmin directly, instead of using FreezeLimit as an inexact proxy for OldestXmin. This is further preparation for the page level freezing work, which will make the function's caller cede control of page level freezing to the function where appropriate (where heap_prepare_freeze_tuple sees a tuple that happens to contain a MultiXactId in its xmax). Author: Peter Geoghegan <pg@bowt.ie> Reviewed-By: Jeff Davis <pgsql@j-davis.com> Discussion: https://postgr.es/m/CAH2-WznS9TxXmz2_=SY+SyJyDFbiOftKofM9=aDo68BbXNBUMA@mail.gmail.com
Diffstat (limited to 'src/backend/commands/cluster.c')
-rw-r--r--src/backend/commands/cluster.c25
1 files changed, 12 insertions, 13 deletions
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index 8966b75bd11..2a5fc2c2805 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/cluster.c
@@ -826,10 +826,7 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose,
TupleDesc oldTupDesc PG_USED_FOR_ASSERTS_ONLY;
TupleDesc newTupDesc PG_USED_FOR_ASSERTS_ONLY;
VacuumParams params;
- TransactionId OldestXmin,
- FreezeXid;
- MultiXactId OldestMxact,
- MultiXactCutoff;
+ struct VacuumCutoffs cutoffs;
bool use_sort;
double num_tuples = 0,
tups_vacuumed = 0,
@@ -918,23 +915,24 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose,
* not to be aggressive about this.
*/
memset(&params, 0, sizeof(VacuumParams));
- vacuum_set_xid_limits(OldHeap, &params, &OldestXmin, &OldestMxact,
- &FreezeXid, &MultiXactCutoff);
+ vacuum_get_cutoffs(OldHeap, &params, &cutoffs);
/*
* 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(FreezeXid, OldHeap->rd_rel->relfrozenxid))
- FreezeXid = OldHeap->rd_rel->relfrozenxid;
+ TransactionIdPrecedes(cutoffs.FreezeLimit,
+ OldHeap->rd_rel->relfrozenxid))
+ cutoffs.FreezeLimit = OldHeap->rd_rel->relfrozenxid;
/*
* MultiXactCutoff, similarly, shouldn't go backwards either.
*/
if (MultiXactIdIsValid(OldHeap->rd_rel->relminmxid) &&
- MultiXactIdPrecedes(MultiXactCutoff, OldHeap->rd_rel->relminmxid))
- MultiXactCutoff = OldHeap->rd_rel->relminmxid;
+ MultiXactIdPrecedes(cutoffs.MultiXactCutoff,
+ OldHeap->rd_rel->relminmxid))
+ cutoffs.MultiXactCutoff = OldHeap->rd_rel->relminmxid;
/*
* Decide whether to use an indexscan or seqscan-and-optional-sort to scan
@@ -973,13 +971,14 @@ copy_table_data(Oid OIDNewHeap, Oid OIDOldHeap, Oid OIDOldIndex, bool verbose,
* values (e.g. because the AM doesn't use freezing).
*/
table_relation_copy_for_cluster(OldHeap, NewHeap, OldIndex, use_sort,
- OldestXmin, &FreezeXid, &MultiXactCutoff,
+ cutoffs.OldestXmin, &cutoffs.FreezeLimit,
+ &cutoffs.MultiXactCutoff,
&num_tuples, &tups_vacuumed,
&tups_recently_dead);
/* return selected values to caller, get set as relfrozenxid/minmxid */
- *pFreezeXid = FreezeXid;
- *pCutoffMulti = MultiXactCutoff;
+ *pFreezeXid = cutoffs.FreezeLimit;
+ *pCutoffMulti = cutoffs.MultiXactCutoff;
/* Reset rd_toastoid just to be tidy --- it shouldn't be looked at again */
NewHeap->rd_toastoid = InvalidOid;