aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/multixact.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c
index ff960833f95..7990b5e5dd9 100644
--- a/src/backend/access/transam/multixact.c
+++ b/src/backend/access/transam/multixact.c
@@ -1222,7 +1222,10 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
debug_elog3(DEBUG2, "GetMembers: asked for %u", multi);
if (!MultiXactIdIsValid(multi) || from_pgupgrade)
+ {
+ *members = NULL;
return -1;
+ }
/* See if the MultiXactId is in the local cache */
length = mXactCacheGetById(multi, members);
@@ -1273,13 +1276,10 @@ GetMultiXactIdMembers(MultiXactId multi, MultiXactMember **members,
LWLockRelease(MultiXactGenLock);
if (MultiXactIdPrecedes(multi, oldestMXact))
- {
ereport(ERROR,
(errcode(ERRCODE_INTERNAL_ERROR),
errmsg("MultiXactId %u does no longer exist -- apparent wraparound",
multi)));
- return -1;
- }
if (!MultiXactIdPrecedes(multi, nextMXact))
ereport(ERROR,
@@ -1379,7 +1379,6 @@ retry:
LWLockRelease(MultiXactOffsetSLRULock);
ptr = (MultiXactMember *) palloc(length * sizeof(MultiXactMember));
- *members = ptr;
/* Now get the members themselves. */
LWLockAcquire(MultiXactMemberSLRULock, LW_EXCLUSIVE);
@@ -1424,6 +1423,9 @@ retry:
LWLockRelease(MultiXactMemberSLRULock);
+ /* A multixid with zero members should not happen */
+ Assert(truelength > 0);
+
/*
* Copy the result into the local cache.
*/
@@ -1431,6 +1433,7 @@ retry:
debug_elog3(DEBUG2, "GetMembers: no cache for %s",
mxid_to_string(multi, truelength, ptr));
+ *members = ptr;
return truelength;
}
@@ -1531,7 +1534,6 @@ mXactCacheGetById(MultiXactId multi, MultiXactMember **members)
size = sizeof(MultiXactMember) * entry->nmembers;
ptr = (MultiXactMember *) palloc(size);
- *members = ptr;
memcpy(ptr, entry->members, size);
@@ -1547,6 +1549,7 @@ mXactCacheGetById(MultiXactId multi, MultiXactMember **members)
*/
dlist_move_head(&MXactCache, iter.cur);
+ *members = ptr;
return entry->nmembers;
}
}