CLUSTER progress: wrong index_rebuild_count for tables with TOAST

Поиск
Список
Период
Сортировка
Искать
От
Adam Lee
Тема
CLUSTER progress: wrong index_rebuild_count for tables with TOAST
Дата
в 09:45:57
Msg-id
aj4gJQMba0kClQmj@Mac
Список
Дерево обсуждения
CLUSTER progress: wrong index_rebuild_count for tables with TOAST Adam Lee <adam8157@gmail.com>
Re: CLUSTER progress: wrong index_rebuild_count for tables with TOAST Antonin Houska <ah@cybertec.at>
Re: CLUSTER progress: wrong index_rebuild_count for tables with TOAST Fujii Masao <masao.fujii@gmail.com>
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
В списке pgsql-hackers по дате отправления
От: Masahiko Sawada
Дата:
Сообщение: Re: DDL deparse
От: Richard Guo
Дата:
FAQ