@@ -86,6 +86,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
86
86
{
87
87
LockBuffer (oldbuf , BUFFER_LOCK_EXCLUSIVE );
88
88
newbuf = InvalidBuffer ;
89
+ extended = false;
89
90
}
90
91
oldpage = BufferGetPage (oldbuf );
91
92
oldlp = PageGetItemId (oldpage , oldoff );
@@ -335,9 +336,8 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
335
336
brinRevmapExtend (revmap , heapBlk );
336
337
337
338
/*
338
- * Obtain a locked buffer to insert the new tuple. Note
339
- * brin_getinsertbuffer ensures there's enough space in the returned
340
- * buffer.
339
+ * Acquire lock on buffer supplied by caller, if any. If it doesn't have
340
+ * enough space, unpin it to obtain a new one below.
341
341
*/
342
342
if (BufferIsValid (* buffer ))
343
343
{
@@ -354,19 +354,26 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
354
354
}
355
355
}
356
356
357
+ /*
358
+ * If we still don't have a usable buffer, have brin_getinsertbuffer
359
+ * obtain one for us.
360
+ */
357
361
if (!BufferIsValid (* buffer ))
358
362
{
359
363
* buffer = brin_getinsertbuffer (idxrel , InvalidBuffer , itemsz , & extended );
360
364
Assert (BufferIsValid (* buffer ));
361
365
Assert (extended || br_page_get_freespace (BufferGetPage (* buffer )) >= itemsz );
362
366
}
367
+ else
368
+ extended = false;
363
369
364
370
/* Now obtain lock on revmap buffer */
365
371
revmapbuf = brinLockRevmapPageForUpdate (revmap , heapBlk );
366
372
367
373
page = BufferGetPage (* buffer );
368
374
blk = BufferGetBlockNumber (* buffer );
369
375
376
+ /* Execute the actual insertion */
370
377
START_CRIT_SECTION ();
371
378
if (extended )
372
379
brin_page_init (BufferGetPage (* buffer ), BRIN_PAGETYPE_REGULAR );
0 commit comments