Make GIN tests using injection points concurrent-safe

f587338dec has introduced in the test module injection_points a SQL
function called injection_points_set_local(), that can be used to make
all the injection points linked to the process where they are attached,
discarded automatically if any remain once the process exits.

e2e3b8ae9e has added a NO_INSTALLCHECK to the test module to prevent
the use of installcheck.  Now that there is a way to make the test
concurrent-safe, let's use it and remove the installcheck restriction.

Concurrency issues could be easily reproduced by running in a tight
loop a command like this one, in src/test/modules/gin/ (hardcoding
pg_sleep() after attaching injection points enlarges the race window)
and a second test suite like contrib/btree_gin/:

  make installcheck USE_MODULE_DB=1

Reviewed-by: Andrey Borodin
Discussion: https://postgr.es/m/ZhNG4Io9uYOgwv3F@paquier.xyz
This commit is contained in:
Michael Paquier 2024-04-10 13:48:13 +09:00
parent 7e85d1c75f
commit 5105c90796
4 changed files with 10 additions and 5 deletions

View File

@ -4,9 +4,6 @@ EXTRA_INSTALL = src/test/modules/injection_points
REGRESS = gin_incomplete_splits
# The injection points are cluster-wide, so disable installcheck
NO_INSTALLCHECK = 1
ifdef USE_PGXS
PG_CONFIG = pg_config
PGXS := $(shell $(PG_CONFIG) --pgxs)

View File

@ -12,6 +12,13 @@
-- This uses injection points to cause errors that leave some page
-- splits in "incomplete" state
create extension injection_points;
-- Make all injection points local to this process, for concurrency.
SELECT injection_points_set_local();
injection_points_set_local
----------------------------
(1 row)
-- Use the index for all the queries
set enable_seqscan=off;
-- Print a NOTICE whenever an incomplete split gets fixed

View File

@ -12,7 +12,5 @@ tests += {
'sql': [
'gin_incomplete_splits',
],
# The injection points are cluster-wide, so disable installcheck
'runningcheck': false,
},
}

View File

@ -14,6 +14,9 @@
-- splits in "incomplete" state
create extension injection_points;
-- Make all injection points local to this process, for concurrency.
SELECT injection_points_set_local();
-- Use the index for all the queries
set enable_seqscan=off;