mirror of
https://github.com/postgres/postgres.git
synced 2025-11-19 13:42:17 +03:00
Refactor tidstore.c iterator buffering.
Previously, TidStoreIterateNext() would expand the set of offsets for each block into an internal buffer that it overwrote each time. In order to be able to collect the offsets for multiple blocks before working with them, change the contract. Now, the offsets are obtained by a separate call to TidStoreGetBlockOffsets(), which can be called at a later time. TidStoreIteratorResult objects are safe to copy and store in a queue. Reviewed-by: Noah Misch <noah@leadboat.com> Discussion: https://postgr.es/m/CAAKRu_bbkmwAzSBgnezancgJeXrQZXy4G4kBTd+5=cr86H5yew@mail.gmail.com
This commit is contained in:
@@ -2126,12 +2126,17 @@ lazy_vacuum_heap_rel(LVRelState *vacrel)
|
||||
Buffer buf;
|
||||
Page page;
|
||||
Size freespace;
|
||||
OffsetNumber offsets[MaxOffsetNumber];
|
||||
int num_offsets;
|
||||
|
||||
vacuum_delay_point();
|
||||
|
||||
blkno = iter_result->blkno;
|
||||
vacrel->blkno = blkno;
|
||||
|
||||
num_offsets = TidStoreGetBlockOffsets(iter_result, offsets, lengthof(offsets));
|
||||
Assert(num_offsets <= lengthof(offsets));
|
||||
|
||||
/*
|
||||
* Pin the visibility map page in case we need to mark the page
|
||||
* all-visible. In most cases this will be very cheap, because we'll
|
||||
@@ -2143,8 +2148,8 @@ lazy_vacuum_heap_rel(LVRelState *vacrel)
|
||||
buf = ReadBufferExtended(vacrel->rel, MAIN_FORKNUM, blkno, RBM_NORMAL,
|
||||
vacrel->bstrategy);
|
||||
LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE);
|
||||
lazy_vacuum_heap_page(vacrel, blkno, buf, iter_result->offsets,
|
||||
iter_result->num_offsets, vmbuffer);
|
||||
lazy_vacuum_heap_page(vacrel, blkno, buf, offsets,
|
||||
num_offsets, vmbuffer);
|
||||
|
||||
/* Now that we've vacuumed the page, record its available space */
|
||||
page = BufferGetPage(buf);
|
||||
|
||||
Reference in New Issue
Block a user