CLUSTER progress: wrong index_rebuild_count for tables with TOAST

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

Browse pgsql-hackers by date

  From Date Subject
Previous Message Masahiko Sawada 2026-06-26 06:45:14 Re: DDL deparse