diff --git a/src/backend/storage/ipc/dsm.c b/src/backend/storage/ipc/dsm.c index f92a52a00e..24f20be3bd 100644 --- a/src/backend/storage/ipc/dsm.c +++ b/src/backend/storage/ipc/dsm.c @@ -1202,7 +1202,7 @@ dsm_create_descriptor(void) { dsm_segment *seg; - if (CurrentResourceOwner) + if (CurrentResourceOwner && !IsResourceOwnerReleasing(CurrentResourceOwner)) ResourceOwnerEnlarge(CurrentResourceOwner); seg = MemoryContextAlloc(TopMemoryContext, sizeof(dsm_segment)); @@ -1213,9 +1213,11 @@ dsm_create_descriptor(void) seg->impl_private = NULL; seg->mapped_address = NULL; seg->mapped_size = 0; - - seg->resowner = CurrentResourceOwner; - if (CurrentResourceOwner) + if (CurrentResourceOwner && IsResourceOwnerReleasing(CurrentResourceOwner)) + seg->resowner = NULL; + else + seg->resowner = CurrentResourceOwner; + if (CurrentResourceOwner && !IsResourceOwnerReleasing(CurrentResourceOwner)) ResourceOwnerRememberDSM(CurrentResourceOwner, seg); slist_init(&seg->on_detach); diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index ac5ca4a765..134fbee59b 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -428,6 +428,11 @@ ResourceOwnerCreate(ResourceOwner parent, const char *name) return owner; } +bool +IsResourceOwnerReleasing(ResourceOwner owner) +{ + return(owner->releasing); +} /* * Make sure there is room for at least one more resource in an array. * diff --git a/src/include/utils/resowner.h b/src/include/utils/resowner.h index e8d452ca7e..69efaca46d 100644 --- a/src/include/utils/resowner.h +++ b/src/include/utils/resowner.h @@ -145,6 +145,7 @@ extern ResourceOwner ResourceOwnerGetParent(ResourceOwner owner); extern void ResourceOwnerNewParent(ResourceOwner owner, ResourceOwner newparent); +extern bool IsResourceOwnerReleasing(ResourceOwner owner); extern void ResourceOwnerEnlarge(ResourceOwner owner); extern void ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind); extern void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind);