diff --git a/src/backend/access/transam/multixact.c b/src/backend/access/transam/multixact.c index 7da993eac05..fd028f75b00 100644 --- a/src/backend/access/transam/multixact.c +++ b/src/backend/access/transam/multixact.c @@ -1220,7 +1220,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); @@ -1271,13 +1274,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, @@ -1377,7 +1377,6 @@ retry: LWLockRelease(MultiXactOffsetControlLock); ptr = (MultiXactMember *) palloc(length * sizeof(MultiXactMember)); - *members = ptr; /* Now get the members themselves. */ LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE); @@ -1422,6 +1421,9 @@ retry: LWLockRelease(MultiXactMemberControlLock); + /* A multixid with zero members should not happen */ + Assert(truelength > 0); + /* * Copy the result into the local cache. */ @@ -1429,6 +1431,7 @@ retry: debug_elog3(DEBUG2, "GetMembers: no cache for %s", mxid_to_string(multi, truelength, ptr)); + *members = ptr; return truelength; } @@ -1529,7 +1532,6 @@ mXactCacheGetById(MultiXactId multi, MultiXactMember **members) size = sizeof(MultiXactMember) * entry->nmembers; ptr = (MultiXactMember *) palloc(size); - *members = ptr; memcpy(ptr, entry->members, size); @@ -1545,6 +1547,7 @@ mXactCacheGetById(MultiXactId multi, MultiXactMember **members) */ dlist_move_head(&MXactCache, iter.cur); + *members = ptr; return entry->nmembers; } }