Re: Report index currently being vacuumed in pg_stat_progress_vacuum - Mailing list pgsql-hackers

From SATYANARAYANA NARLAPURAM
Subject Re: Report index currently being vacuumed in pg_stat_progress_vacuum
Date
Msg-id CAHg+QDfEfBgQ4d-ByBx4ToCQMaB83=i-+aSBROfh6cqoGG74Ew@mail.gmail.com
Whole thread
In response to Report index currently being vacuumed in pg_stat_progress_vacuum  (Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com>)
List pgsql-hackers
Hi,

On Sun, May 3, 2026 at 7:01 PM Bharath Rupireddy <bharath.rupireddyforpostgres@gmail.com> wrote:
Hi,

When VACUUM is in the "vacuuming indexes" or "cleaning up indexes" phase, there is currently no easy way to tell which specific index is being processed. The progress report view shows indexes_total and indexes_processed counters, but not which index is actively being worked on.

This makes it difficult to debug slow or stuck autovacuum workers on tables with multiple indexes of different types (btree, GIN, GiST, BRIN, HNSW, etc.), since one cannot determine which index type or which specific index is causing the delay.

Please find the attached patch adds a new column current_index_relid to pg_stat_progress_vacuum that reports the OID of the index currently being vacuumed or cleaned up. The column is reported for both the "vacuuming indexes" phase and the "cleaning up indexes" phase.

When indexes are being vacuumed in parallel, each parallel worker emits its own row in pg_stat_progress_vacuum with current_index_relid set to the index it is currently processing, and leader_pid pointing to the leader process.

Appreciate any feedback. Thank you!

[1] Example output:

 pid  | datname  | relid | table_name |       phase       | started_by | current_index_relid |  index_name   | leader_pid
------+----------+-------+------------+-------------------+------------+---------------------+---------------+------------
 1420 | postgres | 16395 | vac_test   | vacuuming indexes | autovacuum |               16398 | vac_test_idx1 |          
 1421 | postgres | 16395 | vac_test   | vacuuming indexes |            |               16399 | vac_test_idx2 |       1420
 1423 | postgres | 16395 | vac_test   | vacuuming indexes |            |               16400 | vac_test_idx3 |       1420
(3 rows)

 pid  | datname  | relid | table_name |       phase       | started_by | current_index_relid |  index_name   | leader_pid
------+----------+-------+------------+-------------------+------------+---------------------+---------------+------------
 1346 | postgres | 16395 | vac_test   | vacuuming indexes | manual     |               16398 | vac_test_idx1 |          
(1 row)


[2]
SELECT v.pid, v.datname, v.relid, c.relname AS table_name,
       v.phase, v.started_by, v.current_index_relid,
       COALESCE(ic.relname, '') AS index_name, v.leader_pid
FROM pg_stat_progress_vacuum v
JOIN pg_class c
    ON c.oid = v.relid
LEFT JOIN pg_class ic
    ON ic.oid = v.current_index_relid
WHERE v.relid = $tbl_oid
ORDER BY
    v.leader_pid,
    v.pid;

Bharath, thanks for the patch! A few comments:

 (1) Do we need a global API? Can we add a leader_pid field in PVShared?

+pid_t
+GetParallelLeaderPid(void)
+{
+ return ParallelLeaderPid;
+}

(2):  Looks like current_index_relid is not cleared when we leave the index phases.As a result, once any index has been processed, 
pg_stat_progress_vacuum.current_index_relid keeps reporting that relid through vacuuming heap, truncating heap, cleaning up indexes. 
This will be confusing to the user. Something like below:

1795819|vacuuming heap|0/0|16392|t1_pkey|LEADER

(3) leader_pid type should be integer type similar to pg_Stat_activity?

Thanks,
Satya

pgsql-hackers by date:

Previous
From: Nitin Motiani
Date:
Subject: Re: Adding pg_dump flag for parallel export to pipes
Next
From: Nitin Motiani
Date:
Subject: Re: Proposal: Support Logical replication of large objects