Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfce17e4

Browse files
committed
Fix CLUSTER progress reporting of number of blocks scanned.
Previously pg_stat_progress_cluster view reported the current blocknumber in heap scan as the number of heap blocks scanned (i.e.,heap_blks_scanned). This reported number could be incorrect whensynchronize_seqscans is enabled, because it allowed the heap scan tostart at block in middle. This could result in wraparounds in theheap_blks_scanned column when the heap scan wrapped around.This commit fixes the bug by calculating the number of blocks fromthe block that the heap scan starts at to the current block in scan,and reporting that number in the heap_blks_scanned column.Also, in pg_stat_progress_cluster view, previously heap_blks_scannedcould not reach heap_blks_total at the end of heap scan phaseif the last pages scanned were empty. This commit fixes the bug bymanually updating heap_blks_scanned to the same value asheap_blks_total when the heap scan phase finishes.Back-patch to v12 where pg_stat_progress_cluster view was introduced.Reported-by: Matthias van de MeentAuthor: Matthias van de MeentReviewed-by: Fujii MasaoDiscussion:https://postgr.es/m/CAEze2WjCBWSGkVfYag001Rc4+-nNLDpWM7QbyD6yPvuhKs-gYQ@mail.gmail.com
1 parentea7a167 commitfce17e4

File tree

1 file changed

+27
-2
lines changed

1 file changed

+27
-2
lines changed

‎src/backend/access/heap/heapam_handler.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,7 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
712712
Datum*values;
713713
bool*isnull;
714714
BufferHeapTupleTableSlot*hslot;
715+
BlockNumberprev_cblock=InvalidBlockNumber;
715716

716717
/* Remember if it's a system catalog */
717718
is_system_catalog=IsSystemRelation(OldHeap);
@@ -810,14 +811,38 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
810811
else
811812
{
812813
if (!table_scan_getnextslot(tableScan,ForwardScanDirection,slot))
814+
{
815+
/*
816+
* If the last pages of the scan were empty, we would go to
817+
* the next phase while heap_blks_scanned != heap_blks_total.
818+
* Instead, to ensure that heap_blks_scanned is equivalent to
819+
* total_heap_blks after the table scan phase, this parameter
820+
* is manually updated to the correct value when the table
821+
* scan finishes.
822+
*/
823+
pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_BLKS_SCANNED,
824+
heapScan->rs_nblocks);
813825
break;
826+
}
814827

815828
/*
816829
* In scan-and-sort mode and also VACUUM FULL, set heap blocks
817830
* scanned
831+
*
832+
* Note that heapScan may start at an offset and wrap around, i.e.
833+
* rs_startblock may be >0, and rs_cblock may end with a number
834+
* below rs_startblock. To prevent showing this wraparound to the
835+
* user, we offset rs_cblock by rs_startblock (modulo rs_nblocks).
818836
*/
819-
pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_BLKS_SCANNED,
820-
heapScan->rs_cblock+1);
837+
if (prev_cblock!=heapScan->rs_cblock)
838+
{
839+
pgstat_progress_update_param(PROGRESS_CLUSTER_HEAP_BLKS_SCANNED,
840+
(heapScan->rs_cblock+
841+
heapScan->rs_nblocks-
842+
heapScan->rs_startblock
843+
) %heapScan->rs_nblocks+1);
844+
prev_cblock=heapScan->rs_cblock;
845+
}
821846
}
822847

823848
tuple=ExecFetchSlotHeapTuple(slot, false,NULL);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp