Skip to content

Commit a977e41

Browse files
committed
Refactor ReadMultiXactCounts() into GetMultiXactInfo()
This provides a single entry point to access some information about the state of MultiXacts, able to return some data about multixacts offsets and counts. Originally this function was only able to return some information about the number of multixacts and multixact members, extended here to provide some data about the oldest multixact ID in use and the oldest offset, if known. This change has been proposed in a patch that aims at providing more monitoring capabilities for multixacts, and it is useful on its own. GetMultiXactInfo() is added to multixact.h, becoming available for out-of-core code. Extracted from a larger patch by the same author. Author: Naga Appani <nagnrik@gmail.com> Reviewed-by: Ashutosh Bapat <ashutosh.bapat.oss@gmail.com> Reviewed-by: Michael Paquier <michael@paquier.xyz> Discussion: https://postgr.es/m/CA+QeY+AAsYK6WvBW4qYzHz4bahHycDAY_q5ECmHkEV_eB9ckzg@mail.gmail.com
1 parent 9b7eb6f commit a977e41

File tree

2 files changed

+28
-11
lines changed

2 files changed

+28
-11
lines changed

src/backend/access/transam/multixact.c

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2852,31 +2852,43 @@ find_multixact_start(MultiXactId multi, MultiXactOffset *result)
28522852
}
28532853

28542854
/*
2855-
* Determine how many multixacts, and how many multixact members, currently
2856-
* exist. Return false if unable to determine.
2855+
* GetMultiXactInfo
2856+
*
2857+
* Returns information about the current MultiXact state, as of:
2858+
* multixacts: Number of MultiXacts (nextMultiXactId - oldestMultiXactId)
2859+
* members: Number of member entries (nextOffset - oldestOffset)
2860+
* oldestMultiXactId: Oldest MultiXact ID still in use
2861+
* oldestOffset: Oldest offset still in use
2862+
*
2863+
* Returns false if unable to determine, the oldest offset being unknown.
28572864
*/
2858-
static bool
2859-
ReadMultiXactCounts(uint32 *multixacts, MultiXactOffset *members)
2865+
bool
2866+
GetMultiXactInfo(uint32 *multixacts, MultiXactOffset *members,
2867+
MultiXactId *oldestMultiXactId, MultiXactOffset *oldestOffset)
28602868
{
28612869
MultiXactOffset nextOffset;
2862-
MultiXactOffset oldestOffset;
2863-
MultiXactId oldestMultiXactId;
28642870
MultiXactId nextMultiXactId;
28652871
bool oldestOffsetKnown;
28662872

28672873
LWLockAcquire(MultiXactGenLock, LW_SHARED);
28682874
nextOffset = MultiXactState->nextOffset;
2869-
oldestMultiXactId = MultiXactState->oldestMultiXactId;
2875+
*oldestMultiXactId = MultiXactState->oldestMultiXactId;
28702876
nextMultiXactId = MultiXactState->nextMXact;
2871-
oldestOffset = MultiXactState->oldestOffset;
2877+
*oldestOffset = MultiXactState->oldestOffset;
28722878
oldestOffsetKnown = MultiXactState->oldestOffsetKnown;
28732879
LWLockRelease(MultiXactGenLock);
28742880

28752881
if (!oldestOffsetKnown)
2882+
{
2883+
*members = 0;
2884+
*multixacts = 0;
2885+
*oldestMultiXactId = InvalidMultiXactId;
2886+
*oldestOffset = 0;
28762887
return false;
2888+
}
28772889

2878-
*members = nextOffset - oldestOffset;
2879-
*multixacts = nextMultiXactId - oldestMultiXactId;
2890+
*members = nextOffset - *oldestOffset;
2891+
*multixacts = nextMultiXactId - *oldestMultiXactId;
28802892
return true;
28812893
}
28822894

@@ -2915,9 +2927,11 @@ MultiXactMemberFreezeThreshold(void)
29152927
uint32 victim_multixacts;
29162928
double fraction;
29172929
int result;
2930+
MultiXactId oldestMultiXactId;
2931+
MultiXactOffset oldestOffset;
29182932

29192933
/* If we can't determine member space utilization, assume the worst. */
2920-
if (!ReadMultiXactCounts(&multixacts, &members))
2934+
if (!GetMultiXactInfo(&multixacts, &members, &oldestMultiXactId, &oldestOffset))
29212935
return 0;
29222936

29232937
/* If member space utilization is low, no special action is required. */

src/include/access/multixact.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,9 @@ extern bool MultiXactIdIsRunning(MultiXactId multi, bool isLockOnly);
111111
extern void MultiXactIdSetOldestMember(void);
112112
extern int GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
113113
bool from_pgupgrade, bool isLockOnly);
114+
extern bool GetMultiXactInfo(uint32 *multixacts, MultiXactOffset *members,
115+
MultiXactId *oldestMultiXactId,
116+
MultiXactOffset *oldestOffset);
114117
extern bool MultiXactIdPrecedes(MultiXactId multi1, MultiXactId multi2);
115118
extern bool MultiXactIdPrecedesOrEquals(MultiXactId multi1,
116119
MultiXactId multi2);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy