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);
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,
LWLockRelease(MultiXactOffsetControlLock);
ptr = (MultiXactMember *) palloc(length * sizeof(MultiXactMember));
- *members = ptr;
/* Now get the members themselves. */
LWLockAcquire(MultiXactMemberControlLock, LW_EXCLUSIVE);
LWLockRelease(MultiXactMemberControlLock);
+ /* A multixid with zero members should not happen */
+ Assert(truelength > 0);
+
/*
* Copy the result into the local cache.
*/
debug_elog3(DEBUG2, "GetMembers: no cache for %s",
mxid_to_string(multi, truelength, ptr));
+ *members = ptr;
return truelength;
}
size = sizeof(MultiXactMember) * entry->nmembers;
ptr = (MultiXactMember *) palloc(size);
- *members = ptr;
memcpy(ptr, entry->members, size);
*/
dlist_move_head(&MXactCache, iter.cur);
+ *members = ptr;
return entry->nmembers;
}
}