CLUSTER progress: wrong index_rebuild_count for tables with TOAST
Adam Lee <adam8157@gmail.com>
From: Adam Lee <adam8157@gmail.com>
To: pgsql-hackers@lists.postgresql.org
Cc: Antonin Houska <ah@cybertec.at>, Álvaro Herrera <alvherre@kurilemu.de>
Date: 2026-06-26T06:45:57Z
Lists: pgsql-hackers
Attachments
Hi, When I run CLUSTER (or VACUUM FULL / REPACK) on a table that has a TOAST table, pg_stat_progress_cluster shows a wrong index_rebuild_count. During the heap scan the count is already equal to the number of indexes, but it should be 0 until the indexes are rebuilt at the end. A simple way to reproduce it. Run CLUSTER in one session, and query the view from another session at the same time: ``` CREATE TABLE t (i int, x text); INSERT INTO t SELECT g, repeat(md5(g::text), 1000) FROM generate_series(1, 5) g; CREATE INDEX ON t (i); CLUSTER t USING t_i_idx; -- phase "seq scanning heap", index_rebuild_count = 2 (should be 0) ``` The reason is that make_new_heap() creates the new TOAST table, and its TOAST index, before the heap is scanned. Building that index reports CREATE INDEX progress. CREATE INDEX and the cluster command use the same progress field for different things, so the cluster command then shows a CREATE INDEX value as its index_rebuild_count. The fix is to not report progress for the TOAST index build, because it is an internal index, not a user CREATE INDEX. The patch also adds an isolation test that pauses CLUSTER at the start of the heap scan and checks that index_rebuild_count is 0. -- Adam