diff --git a/src/backend/storage/buffer/localbuf.c b/src/backend/storage/buffer/localbuf.c index 1be4f4f8da..1f02fed250 100644 --- a/src/backend/storage/buffer/localbuf.c +++ b/src/backend/storage/buffer/localbuf.c @@ -374,6 +374,9 @@ ExtendBufferedRelLocal(BufferManagerRelation bmr, victim_buf_id = -buffers[i] - 1; victim_buf_hdr = GetLocalBufferDescriptor(victim_buf_id); + /* in case we need to pin an existing buffer below */ + ResourceOwnerEnlarge(CurrentResourceOwner); + InitBufferTag(&tag, &bmr.smgr->smgr_rlocator.locator, fork, first_block + i); hresult = (LocalBufferLookupEnt *) @@ -646,6 +649,8 @@ InitLocalBuffers(void) * XXX: We could have a slightly more efficient version of PinLocalBuffer() * that does not support adjusting the usagecount - but so far it does not * seem worth the trouble. + * + * Note that ResourceOwnerEnlarge() must have been done already. */ bool PinLocalBuffer(BufferDesc *buf_hdr, bool adjust_usagecount) diff --git a/src/backend/utils/resowner/resowner.c b/src/backend/utils/resowner/resowner.c index 67cc332e80..aa199b23ff 100644 --- a/src/backend/utils/resowner/resowner.c +++ b/src/backend/utils/resowner/resowner.c @@ -548,8 +548,13 @@ ResourceOwnerRemember(ResourceOwner owner, Datum value, const ResourceOwnerDesc /* * Forget that an object is owned by a ResourceOwner * - * Note: if same resource ID is associated with the ResourceOwner more than + * Note: If same resource ID is associated with the ResourceOwner more than * once, one instance is removed. + * + * Note: Forgetting a resource does not guarantee that there is room to + * remember a new resource. One exception is when you forget the most + * recently remembered resource; that does make room for a new remember call. + * Some code callers rely on that exception. */ void ResourceOwnerForget(ResourceOwner owner, Datum value, const ResourceOwnerDesc *kind)