fix_for_resource_owner_error.patch
application/octet-stream
Filename: fix_for_resource_owner_error.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/storage/ipc/dsm.c | 6 | 4 |
| src/backend/utils/resowner/resowner.c | 5 | 0 |
| src/include/utils/resowner.h | 1 | 0 |
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);