mirror of
https://github.com/postgres/postgres.git
synced 2025-06-30 21:42:05 +03:00
Fix bug in bulk extending temp relation after failure
A ResourceOwnerEnlarge() call was missing. That led to an error:
ERROR: ResourceOwnerRemember called but array was full
and an assertion failure, if you tried to extend a temp relation again
after a failure. Alexander's test case used running out of disk space
to trigger the original failure.
This bug was introduced in the large ResourceOwner rewrite commit
b8bff07daa
. Before that, the UnpinLocalBuffer() call guaranteed that
the subsequent PinLocalBuffer() will succeed, but after the rewrite,
releasing an old resource doesn't guarantee that there is space for a
new one.
Add a comment explaining why the UnpinBuffer + PinBuffer calls in
BufferAlloc(), with no ResourceOwnerEnlarge() in between, are safe.
Reported-by: Alexander Lakhin
Discussion: https://www.postgresql.org/message-id/dc574fea-c83e-a600-08cd-10881762e4fa@gmail.com
This commit is contained in:
@ -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)
|
||||
|
Reference in New Issue
Block a user