summaryrefslogtreecommitdiff
path: root/src/backend/postmaster
diff options
context:
space:
mode:
authorNoah Misch2024-04-29 17:25:33 +0000
committerNoah Misch2024-04-29 17:25:33 +0000
commitdd0183469bb779247c96e86c2272dca7ff4ec9e7 (patch)
tree1e2998dec368e7476dde36894e2b7f4356308f12 /src/backend/postmaster
parentf65ab862e3b8d96c6886641155d9447bc73b5126 (diff)
Avoid repeating loads of frozen ID values.
Repeating loads of inplace-updated fields tends to cause bugs like the one from the previous commit. While there's no bug to fix in these code sites, adopt the load-once style. This improves the chance of future copy/paste finding the safe style. Discussion: https://postgr.es/m/20240423003956.e7.nmisch@google.com
Diffstat (limited to 'src/backend/postmaster')
-rw-r--r--src/backend/postmaster/autovacuum.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index c367ede6f88..9a925a10cdc 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2938,6 +2938,7 @@ relation_needs_vacanalyze(Oid relid,
int freeze_max_age;
int multixact_freeze_max_age;
TransactionId xidForceLimit;
+ TransactionId relfrozenxid;
MultiXactId multiForceLimit;
Assert(classForm != NULL);
@@ -2989,16 +2990,18 @@ relation_needs_vacanalyze(Oid relid,
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;