From 6cae5f3ebfdad3c354b839e0a5d7836875051199 Mon Sep 17 00:00:00 2001 From: "Chao Li (Evan)" Date: Wed, 9 Sep 2026 16:14:48 +0800 Subject: [PATCH v2 2/2] Fix command reporting for REPACK using sequential scan and sort pg_stat_progress_cluster uses repack_index_relid to translate REPACK into CLUSTER or VACUUM FULL. However, this field was set only when an index scan was used. When REPACK followed an index's ordering using a sequential scan and sort, the view incorrectly reported VACUUM FULL. Initialize the field from the requested ordering index when starting progress reporting, independently of the scan method. Update the documentation to describe the field's meaning and explain how REPACK is translated in the compatibility view. Suggested-by: Fujii Masao Author: Chao Li Reviewed-by: Fujii Masao Discussion: https://postgr.es/m/CAN4CZFMzy2V_wvRCBW5K8=wVCk1-C7nq=8otXO=u+s_1KZHqyA@mail.gmail.com --- doc/src/sgml/monitoring.sgml | 13 +++++++------ src/backend/access/heap/heapam_handler.c | 12 ++---------- src/backend/commands/repack.c | 8 +++++++- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index b403fb990a7..48db5aec350 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -6787,8 +6787,9 @@ FROM pg_stat_get_backend_idset() AS backendid; The command that is running. Either CLUSTER or VACUUM FULL. Because this view exists for backwards-compatibility purposes only, - it will translate any REPACK command into one of - these other two. + it will translate a REPACK command into + CLUSTER if index ordering is requested, + or VACUUM FULL otherwise. @@ -6806,8 +6807,8 @@ FROM pg_stat_get_backend_idset() AS backendid; cluster_index_relid oid - If the table is being scanned using an index, this is the OID of the - index being used; otherwise, it is zero. + OID of the index defining the order of the rewritten table, or zero + if no index ordering is requested. @@ -7480,8 +7481,8 @@ FROM pg_stat_get_backend_idset() AS backendid; repack_index_relid oid - If the table is being scanned using an index, this is the OID of the - index being used; otherwise, it is zero. + OID of the index defining the order of the rewritten table, or zero + if no index ordering is requested. diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index 0f24a132564..dd2218bbbaf 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -660,16 +660,8 @@ heapam_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap, */ if (OldIndex != NULL && !use_sort) { - const int ci_index[] = { - PROGRESS_REPACK_PHASE, - PROGRESS_REPACK_INDEX_RELID - }; - int64 ci_val[2]; - - /* Set phase and OIDOldIndex to columns */ - ci_val[0] = PROGRESS_REPACK_PHASE_INDEX_SCAN_HEAP; - ci_val[1] = RelationGetRelid(OldIndex); - pgstat_progress_update_multi_param(2, ci_index, ci_val); + pgstat_progress_update_param(PROGRESS_REPACK_PHASE, + PROGRESS_REPACK_PHASE_INDEX_SCAN_HEAP); tableScan = NULL; heapScan = NULL; diff --git a/src/backend/commands/repack.c b/src/backend/commands/repack.c index 57f28f1a420..6f7c37c39b2 100644 --- a/src/backend/commands/repack.c +++ b/src/backend/commands/repack.c @@ -511,6 +511,11 @@ cluster_rel(RepackCommand cmd, Relation OldHeap, Oid indexOid, bool recheck = ((params->options & CLUOPT_RECHECK) != 0); bool concurrent = ((params->options & CLUOPT_CONCURRENT) != 0); Oid ident_idx = InvalidOid; + const int progress_index[] = { + PROGRESS_REPACK_COMMAND, + PROGRESS_REPACK_INDEX_RELID + }; + const int64 progress_values[] = {cmd, indexOid}; /* Determine the lock mode to use. */ lmode = RepackLockLevel(concurrent); @@ -526,7 +531,8 @@ cluster_rel(RepackCommand cmd, Relation OldHeap, Oid indexOid, CHECK_FOR_INTERRUPTS(); pgstat_progress_start_command(PROGRESS_COMMAND_REPACK, tableOid); - pgstat_progress_update_param(PROGRESS_REPACK_COMMAND, cmd); + /* Report the ordering index even when using a sequential scan and sort. */ + pgstat_progress_update_multi_param(2, progress_index, progress_values); /* * Switch to the table owner's userid, so that any index functions are run -- 2.50.1 (Apple Git-155)