Re: Parallel CREATE INDEX for BRIN indexes
Tomas Vondra <tomas.vondra@enterprisedb.com>
From: Tomas Vondra <tomas.vondra@enterprisedb.com>
To: Alexander LAW <1@1o.ru>, Andres Freund <andres@anarazel.de>
Cc: Matthias van de Meent <boekewurm+postgres@gmail.com>,
PostgreSQL Hackers <pgsql-hackers@lists.postgresql.org>
Date: 2024-04-15T08:18:46Z
Lists: pgsql-hackers
On 4/15/24 08:00, Alexander LAW wrote: > Hello Tomas, > > 14.04.2024 20:09, Tomas Vondra wrote: >> I've pushed this, including backpatching the two fixes. I've reduced the >> amount of data needed by the test, and made sure it works on 32-bits too >> (I was a bit worried it might be sensitive to that, but that seems not >> to be the case). > > I've discovered that that test addition brings some instability to the > test. > With the following pageinspect/Makefile modification: > -REGRESS = page btree brin gin gist hash checksum oldextversions > +REGRESS = page btree brin $(shell printf 'brin %.0s' `seq 99`) gin gist > hash checksum oldextversions > > echo "autovacuum_naptime = 1" > /tmp/temp.config > TEMP_CONFIG=/tmp/temp.config make -s check -C contrib/pageinspect > fails for me as below: > ... > ok 17 - brin 127 ms > not ok 18 - brin 140 ms > ok 19 - brin 125 ms > ... > # 4 of 107 tests failed. > > The following change > -CREATE TABLE brin_parallel_test (a int, b text, c bigint) WITH > (fillfactor=40); > +CREATE TEMP TABLE brin_parallel_test (a int, b text, c bigint) WITH > (fillfactor=40); > (similar to e2933a6e1) makes the test pass reliably for me. > Thanks! This reproduces the issue for me. I believe this happens because the test does "DELETE + VACUUM" to generate "gaps" in the table, to get empty ranges in the BRIN. I guess what's happening is that something (autovacuum or likely something else) blocks the explicit VACUUM from cleaning some of the pages with deleted tuples, but then the cleanup happens shortly after between building the the serial/parallel indexes. That would explain the differences reported by the regression test. When I thought about this while writing the test, my reasoning was that even if the explicit vacuum occasionally fails to clean something, it should affect all the indexes equally. Which is why I wrote the test to compare the results using EXCEPT, not checking the exact output. I'm not a huge fan of temporary tables in regression tests, because it disappears at the end, making it impossible to inspect the data after a failure. But the only other option I could think of is disabling autovacuum on the table, but that does not seem to prevent the failures. I'll try a bit more to make this work without the temp table. regards -- Tomas Vondra EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company
Commits
-
Remove incidental md5() function use from test
- 47b47a5617fa 17.0 landed
- 95b856de23c7 18.0 landed
-
Cleanup parallel BRIN index build code
- 0c2f5552d5d4 17.0 landed
-
Stabilize test of BRIN parallel create
- 0bd4b0689ba1 17.0 landed
- 4d916dd876c3 17.0 landed
-
Revert "Stabilize test of BRIN parallel create"
- a89cd7bfcdbb 17.0 landed
-
Add regression test for BRIN parallel builds
- 8225c2fd40cd 17.0 landed
-
Use the correct PG_DETOAST_DATUM macro in BRIN
- 8cea358b128f 16.3 landed
- bb616ed3e6a2 17.0 landed
-
Update nbits_set in brin_bloom_union
- ad23af83dad3 14.12 landed
- 3cd4135119be 15.7 landed
- ccd8f0fa1e54 16.3 landed
- 2f20ced1eb53 17.0 landed
-
Fix parallel BRIN builds with synchronized scans
- cb44a8345e7c 17.0 landed
-
Allow parallel CREATE INDEX for BRIN indexes
- b43757171470 17.0 landed
-
Add empty BRIN ranges during CREATE INDEX
- dae761a87eda 17.0 landed