| From: | Adam Lee <adam8157(at)gmail(dot)com> |
|---|---|
| To: | pgsql-hackers(at)lists(dot)postgresql(dot)org |
| Cc: | Antonin Houska <ah(at)cybertec(dot)at>, Álvaro Herrera <alvherre(at)kurilemu(dot)de> |
| Subject: | CLUSTER progress: wrong index_rebuild_count for tables with TOAST |
| Date: | 2026-06-26 06:45:57 |
| Message-ID: | aj4gJQMba0kClQmj@Mac |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-hackers |
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
| Attachment | Content-Type | Size |
|---|---|---|
| v1-0001-Suppress-CREATE-INDEX-progress-while-building-a-T.patch | text/plain | 8.4 KB |
| From | Date | Subject | |
|---|---|---|---|
| Previous Message | Masahiko Sawada | 2026-06-26 06:45:14 | Re: DDL deparse |