Skip to content

Commit 32acad7

Browse files
Convert heap_vac_scan_next_block() boolean parameters to flags
The read stream API only allows one piece of extra per block state to be passed back to the API user (per_buffer_data). lazy_scan_heap() needs two pieces of per-buffer data: whether or not the block was all-visible in the visibility map and whether or not it was eagerly scanned. Convert these two pieces of information to flags so that they can be populated by heap_vac_scan_next_block() and returned to lazy_scan_heap(). A future commit will turn heap_vac_scan_next_block() into the read stream callback for heap phase I vacuuming. Reviewed-by: Masahiko Sawada <sawada.mshk@gmail.com> Reviewed-by: Thomas Munro <thomas.munro@gmail.com> Discussion: https://postgr.es/m/CAAKRu_bmx33jTqATP5GKNFYwAg02a9dDtk4U_ciEjgBHZSVkOQ%40mail.gmail.com
1 parent 977d865 commit 32acad7

File tree

1 file changed

+27
-20
lines changed

1 file changed

+27
-20
lines changed

src/backend/access/heap/vacuumlazy.c

Lines changed: 27 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,13 @@ typedef enum
248248
*/
249249
#define EAGER_SCAN_REGION_SIZE 4096
250250

251+
/*
252+
* heap_vac_scan_next_block() sets these flags to communicate information
253+
* about the block it read to the caller.
254+
*/
255+
#define VAC_BLK_WAS_EAGER_SCANNED (1 << 0)
256+
#define VAC_BLK_ALL_VISIBLE_ACCORDING_TO_VM (1 << 1)
257+
251258
typedef struct LVRelState
252259
{
253260
/* Target heap relation and its indexes */
@@ -417,8 +424,7 @@ static void lazy_scan_heap(LVRelState *vacrel);
417424
static void heap_vacuum_eager_scan_setup(LVRelState *vacrel,
418425
VacuumParams *params);
419426
static bool heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
420-
bool *all_visible_according_to_vm,
421-
bool *was_eager_scanned);
427+
uint8 *blk_info);
422428
static void find_next_unskippable_block(LVRelState *vacrel, bool *skipsallvis);
423429
static bool lazy_scan_new_or_empty(LVRelState *vacrel, Buffer buf,
424430
BlockNumber blkno, Page page,
@@ -1171,8 +1177,7 @@ lazy_scan_heap(LVRelState *vacrel)
11711177
BlockNumber rel_pages = vacrel->rel_pages,
11721178
blkno,
11731179
next_fsm_block_to_vacuum = 0;
1174-
bool all_visible_according_to_vm,
1175-
was_eager_scanned = false;
1180+
uint8 blk_info = 0;
11761181
BlockNumber orig_eager_scan_success_limit =
11771182
vacrel->eager_scan_remaining_successes; /* for logging */
11781183
Buffer vmbuffer = InvalidBuffer;
@@ -1196,8 +1201,7 @@ lazy_scan_heap(LVRelState *vacrel)
11961201
vacrel->next_unskippable_eager_scanned = false;
11971202
vacrel->next_unskippable_vmbuffer = InvalidBuffer;
11981203

1199-
while (heap_vac_scan_next_block(vacrel, &blkno, &all_visible_according_to_vm,
1200-
&was_eager_scanned))
1204+
while (heap_vac_scan_next_block(vacrel, &blkno, &blk_info))
12011205
{
12021206
Buffer buf;
12031207
Page page;
@@ -1206,7 +1210,7 @@ lazy_scan_heap(LVRelState *vacrel)
12061210
bool got_cleanup_lock = false;
12071211

12081212
vacrel->scanned_pages++;
1209-
if (was_eager_scanned)
1213+
if (blk_info & VAC_BLK_WAS_EAGER_SCANNED)
12101214
vacrel->eager_scanned_pages++;
12111215

12121216
/* Report as block scanned, update error traceback information */
@@ -1331,7 +1335,8 @@ lazy_scan_heap(LVRelState *vacrel)
13311335
*/
13321336
if (got_cleanup_lock)
13331337
lazy_scan_prune(vacrel, buf, blkno, page,
1334-
vmbuffer, all_visible_according_to_vm,
1338+
vmbuffer,
1339+
blk_info & VAC_BLK_ALL_VISIBLE_ACCORDING_TO_VM,
13351340
&has_lpdead_items, &vm_page_frozen);
13361341

13371342
/*
@@ -1348,7 +1353,8 @@ lazy_scan_heap(LVRelState *vacrel)
13481353
* exclude pages skipped due to cleanup lock contention from eager
13491354
* freeze algorithm caps.
13501355
*/
1351-
if (got_cleanup_lock && was_eager_scanned)
1356+
if (got_cleanup_lock &&
1357+
(blk_info & VAC_BLK_WAS_EAGER_SCANNED))
13521358
{
13531359
/* Aggressive vacuums do not eager scan. */
13541360
Assert(!vacrel->aggressive);
@@ -1479,11 +1485,11 @@ lazy_scan_heap(LVRelState *vacrel)
14791485
* and various thresholds to skip blocks which do not need to be processed and
14801486
* sets blkno to the next block to process.
14811487
*
1482-
* The block number and visibility status of the next block to process are set
1483-
* in *blkno and *all_visible_according_to_vm. The return value is false if
1484-
* there are no further blocks to process. If the block is being eagerly
1485-
* scanned, was_eager_scanned is set so that the caller can count whether or
1486-
* not an eagerly scanned page is successfully frozen.
1488+
* The block number of the next block to process is set in *blkno and its
1489+
* visibility status and whether or not it was eager scanned is set in
1490+
* *blk_info.
1491+
*
1492+
* The return value is false if there are no further blocks to process.
14871493
*
14881494
* vacrel is an in/out parameter here. Vacuum options and information about
14891495
* the relation are read. vacrel->skippedallvis is set if we skip a block
@@ -1493,15 +1499,14 @@ lazy_scan_heap(LVRelState *vacrel)
14931499
*/
14941500
static bool
14951501
heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
1496-
bool *all_visible_according_to_vm,
1497-
bool *was_eager_scanned)
1502+
uint8 *blk_info)
14981503
{
14991504
BlockNumber next_block;
15001505

15011506
/* relies on InvalidBlockNumber + 1 overflowing to 0 on first call */
15021507
next_block = vacrel->current_block + 1;
15031508

1504-
*was_eager_scanned = false;
1509+
*blk_info = 0;
15051510

15061511
/* Have we reached the end of the relation? */
15071512
if (next_block >= vacrel->rel_pages)
@@ -1562,7 +1567,7 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
15621567
* otherwise they would've been unskippable.
15631568
*/
15641569
*blkno = vacrel->current_block = next_block;
1565-
*all_visible_according_to_vm = true;
1570+
*blk_info |= VAC_BLK_ALL_VISIBLE_ACCORDING_TO_VM;
15661571
return true;
15671572
}
15681573
else
@@ -1574,8 +1579,10 @@ heap_vac_scan_next_block(LVRelState *vacrel, BlockNumber *blkno,
15741579
Assert(next_block == vacrel->next_unskippable_block);
15751580

15761581
*blkno = vacrel->current_block = next_block;
1577-
*all_visible_according_to_vm = vacrel->next_unskippable_allvis;
1578-
*was_eager_scanned = vacrel->next_unskippable_eager_scanned;
1582+
if (vacrel->next_unskippable_allvis)
1583+
*blk_info |= VAC_BLK_ALL_VISIBLE_ACCORDING_TO_VM;
1584+
if (vacrel->next_unskippable_eager_scanned)
1585+
*blk_info |= VAC_BLK_WAS_EAGER_SCANNED;
15791586
return true;
15801587
}
15811588
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy