Commit 312747c2 authored by Robert Haas's avatar Robert Haas

Fix DetermineSafeOldestOffset for the case where there are no mxacts.

Commit b69bf30b failed to take into
account the possibility that there might be no multixacts in existence
at all.

Report by Thomas Munro; patch by me.
parent 1a8a4e5c
...@@ -2492,13 +2492,24 @@ DetermineSafeOldestOffset(MultiXactId oldestMXact) ...@@ -2492,13 +2492,24 @@ DetermineSafeOldestOffset(MultiXactId oldestMXact)
return; return;
/* /*
* We determine the safe upper bound for offsets of new xacts by reading * Determine the offset of the oldest multixact. Normally, we can read
* the offset of the oldest multixact, and going back one segment. This * the offset from the multixact itself, but there's an important special
* way, the sequence of multixact member segments will always have a * case: if there are no multixacts in existence at all, oldestMXact
* one-segment hole at a minimum. We start spewing warnings a few * obviously can't point to one. It will instead point to the multixact
* complete segments before that. * ID that will be assigned the next time one is needed.
*/ */
oldestOffset = find_multixact_start(oldestMXact); LWLockAcquire(MultiXactGenLock, LW_SHARED);
if (MultiXactState->nextMXact == oldestMXact)
{
oldestOffset = MultiXactState->nextOffset;
LWLockRelease(MultiXactGenLock);
}
else
{
LWLockRelease(MultiXactGenLock);
oldestOffset = find_multixact_start(oldestMXact);
}
/* move back to start of the corresponding segment */ /* move back to start of the corresponding segment */
oldestOffset -= oldestOffset % oldestOffset -= oldestOffset %
(MULTIXACT_MEMBERS_PER_PAGE * SLRU_PAGES_PER_SEGMENT); (MULTIXACT_MEMBERS_PER_PAGE * SLRU_PAGES_PER_SEGMENT);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment