From b511667577101768f243acaf8e1f382a1e9d4fe4 Mon Sep 17 00:00:00 2001 From: Maxim Orlov Date: Thu, 6 Nov 2025 16:20:18 +0300 Subject: [PATCH v25 04/10] Remove oldestOffset/oldestOffsetKnown from multixact Since we rewrite all multitransactions during pg_upgrade, the oldest offset for a new cluster will no longer be missing on disc. --- src/backend/access/transam/multixact.c | 101 ++----------------------- src/include/access/multixact.h | 3 - 2 files changed, 5 insertions(+), 99 deletions(-) diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index e0323ec1014..78ba6d72a92 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -140,14 +140,6 @@ typedef struct MultiXactStateData MultiXactId oldestMultiXactId; Oid oldestMultiXactDB; - /* - * Oldest multixact offset that is potentially referenced by a multixact - * referenced by a relation. We don't always know this value, so there's - * a flag here to indicate whether or not we currently do. - */ - MultiXactOffset oldestOffset; - bool oldestOffsetKnown; - /* support for anti-wraparound measures */ MultiXactId multiVacLimit; MultiXactId multiWarnLimit; @@ -2371,10 +2363,7 @@ SetOffsetVacuumLimit(bool is_startup) MultiXactId oldestMultiXactId; MultiXactId nextMXact; MultiXactOffset oldestOffset = 0; /* placate compiler */ - MultiXactOffset prevOldestOffset; MultiXactOffset nextOffset; - bool oldestOffsetKnown = false; - bool prevOldestOffsetKnown; /* * NB: Have to prevent concurrent truncation, we might otherwise try to @@ -2387,8 +2376,6 @@ SetOffsetVacuumLimit(bool is_startup) oldestMultiXactId = MultiXactState->oldestMultiXactId; nextMXact = MultiXactState->nextMXact; nextOffset = MultiXactState->nextOffset; - prevOldestOffsetKnown = MultiXactState->oldestOffsetKnown; - prevOldestOffset = MultiXactState->oldestOffset; Assert(MultiXactState->finishedStartup); LWLockRelease(MultiXactGenLock); @@ -2406,57 +2393,20 @@ SetOffsetVacuumLimit(bool is_startup) * offset. */ oldestOffset = nextOffset; - oldestOffsetKnown = true; } - else + else if (!find_multixact_start(oldestMultiXactId, &oldestOffset)) { - /* - * Figure out where the oldest existing multixact's offsets are - * stored. Due to bugs in early release of PostgreSQL 9.3.X and 9.4.X, - * the supposedly-earliest multixact might not really exist. We are - * careful not to fail in that case. - */ - oldestOffsetKnown = - find_multixact_start(oldestMultiXactId, &oldestOffset); - - if (!oldestOffsetKnown) - ereport(LOG, - (errmsg("oldest checkpointed MultiXact %u does not exist on disk", - oldestMultiXactId))); + ereport(LOG, + (errmsg("oldest checkpointed MultiXact %u does not exist on disk", + oldestMultiXactId))); } LWLockRelease(MultiXactTruncationLock); - /* - * If we can, compute limits (and install them MultiXactState) to prevent - * overrun of old data in the members SLRU area. We can only do so if the - * oldest offset is known though. - * - * FIXME: Is !oldestOffsetKnown possible anymore? At least update the comment: - * we won't overrun members anymore. - */ - if (prevOldestOffsetKnown) - { - /* - * If we failed to get the oldest offset this time, but we have a - * value from a previous pass through this function, use the old - * values rather than automatically forcing an autovacuum cycle again. - */ - oldestOffset = prevOldestOffset; - oldestOffsetKnown = true; - } - - /* Install the computed values */ - LWLockAcquire(MultiXactGenLock, LW_EXCLUSIVE); - MultiXactState->oldestOffset = oldestOffset; - MultiXactState->oldestOffsetKnown = oldestOffsetKnown; - LWLockRelease(MultiXactGenLock); - /* * Do we need autovacuum? If we're not sure, assume yes. */ - return !oldestOffsetKnown || - (nextOffset - oldestOffset > MULTIXACT_MEMBER_AUTOVAC_THRESHOLD); + return nextOffset - oldestOffset > MULTIXACT_MEMBER_AUTOVAC_THRESHOLD; } /* @@ -2503,47 +2453,6 @@ find_multixact_start(MultiXactId multi, MultiXactOffset *result) return true; } -/* - * GetMultiXactInfo - * - * Returns information about the current MultiXact state, as of: - * multixacts: Number of MultiXacts (nextMultiXactId - oldestMultiXactId) - * members: Number of member entries (nextOffset - oldestOffset) - * oldestMultiXactId: Oldest MultiXact ID still in use - * oldestOffset: Oldest offset still in use - * - * Returns false if unable to determine, the oldest offset being unknown. - */ -bool -GetMultiXactInfo(uint32 *multixacts, MultiXactOffset *members, - MultiXactId *oldestMultiXactId, MultiXactOffset *oldestOffset) -{ - MultiXactOffset nextOffset; - MultiXactId nextMultiXactId; - bool oldestOffsetKnown; - - LWLockAcquire(MultiXactGenLock, LW_SHARED); - nextOffset = MultiXactState->nextOffset; - *oldestMultiXactId = MultiXactState->oldestMultiXactId; - nextMultiXactId = MultiXactState->nextMXact; - *oldestOffset = MultiXactState->oldestOffset; - oldestOffsetKnown = MultiXactState->oldestOffsetKnown; - LWLockRelease(MultiXactGenLock); - - if (!oldestOffsetKnown) - { - *members = 0; - *multixacts = 0; - *oldestMultiXactId = InvalidMultiXactId; - *oldestOffset = 0; - return false; - } - - *members = nextOffset - *oldestOffset; - *multixacts = nextMultiXactId - *oldestMultiXactId; - return true; -} - typedef struct mxtruncinfo { int64 earliestExistingPage; diff --git a/src/include/access/multixact.h b/src/include/access/multixact.h index 7d98fe0fe32..d688b547c54 100644 --- a/src/include/access/multixact.h +++ b/src/include/access/multixact.h @@ -109,9 +109,6 @@ extern bool MultiXactIdIsRunning(MultiXactId multi, bool isLockOnly); extern void MultiXactIdSetOldestMember(void); extern int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members, bool from_pgupgrade, bool isLockOnly); -extern bool GetMultiXactInfo(uint32 *multixacts, MultiXactOffset *members, - MultiXactId *oldestMultiXactId, - MultiXactOffset *oldestOffset); extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2); extern bool MultiXactIdPrecedesOrEquals(MultiXactId multi1, MultiXactId multi2); -- 2.47.3