injection_points: Add basic isolation test

This test can act as a template when implementing an isolation test with
injection points, and tracks in a much simpler way some of the behaviors
implied in the existing isolation test "inplace" that has been added in
c35f419d6efb.  Particularly, a detach does not affect a backend wait; a
wait needs to be interrupted by a wakeup.

Reviewed-by: Bertrand Drouvot
Discussion: https://postgr.es/m/ZxGTONm_ctQz--io@paquier.xyz
This commit is contained in:
Michael Paquier 2024-10-21 11:10:51 +09:00
parent f1c141fe14
commit a7800cf498
4 changed files with 111 additions and 1 deletions

View File

@ -13,7 +13,7 @@ PGFILEDESC = "injection_points - facility for injection points"
REGRESS = injection_points reindex_conc REGRESS = injection_points reindex_conc
REGRESS_OPTS = --dlpath=$(top_builddir)/src/test/regress REGRESS_OPTS = --dlpath=$(top_builddir)/src/test/regress
ISOLATION = inplace ISOLATION = basic inplace
TAP_TESTS = 1 TAP_TESTS = 1

View File

@ -0,0 +1,74 @@
Parsed test spec with 2 sessions
starting permutation: wait1 wakeup2 detach2
injection_points_attach
-----------------------
(1 row)
step wait1: SELECT injection_points_run('injection-points-wait'); <waiting ...>
step wakeup2: SELECT injection_points_wakeup('injection-points-wait');
injection_points_wakeup
-----------------------
(1 row)
step wait1: <... completed>
injection_points_run
--------------------
(1 row)
step detach2: SELECT injection_points_detach('injection-points-wait');
injection_points_detach
-----------------------
(1 row)
starting permutation: wait1 detach2 wakeup2
injection_points_attach
-----------------------
(1 row)
step wait1: SELECT injection_points_run('injection-points-wait'); <waiting ...>
step detach2: SELECT injection_points_detach('injection-points-wait');
injection_points_detach
-----------------------
(1 row)
step wakeup2: SELECT injection_points_wakeup('injection-points-wait');
injection_points_wakeup
-----------------------
(1 row)
step wait1: <... completed>
injection_points_run
--------------------
(1 row)
starting permutation: detach2 wait1 wakeup2
injection_points_attach
-----------------------
(1 row)
step detach2: SELECT injection_points_detach('injection-points-wait');
injection_points_detach
-----------------------
(1 row)
step wait1: SELECT injection_points_run('injection-points-wait');
injection_points_run
--------------------
(1 row)
step wakeup2: SELECT injection_points_wakeup('injection-points-wait');
ERROR: could not find injection point injection-points-wait to wake up

View File

@ -42,6 +42,7 @@ tests += {
}, },
'isolation': { 'isolation': {
'specs': [ 'specs': [
'basic',
'inplace', 'inplace',
], ],
}, },

View File

@ -0,0 +1,35 @@
# Basic isolation test for injection points.
#
# This checks the interactions between wakeup, wait and detach.
# Feel free to use it as a template when implementing an isolation
# test with injection points.
setup
{
CREATE EXTENSION injection_points;
}
teardown
{
DROP EXTENSION injection_points;
}
# Wait happens in the first session, wakeup in the second session.
session s1
setup {
SELECT injection_points_set_local();
SELECT injection_points_attach('injection-points-wait', 'wait');
}
step wait1 { SELECT injection_points_run('injection-points-wait'); }
session s2
step wakeup2 { SELECT injection_points_wakeup('injection-points-wait'); }
step detach2 { SELECT injection_points_detach('injection-points-wait'); }
# Detach after wait and wakeup.
permutation wait1 wakeup2 detach2
# Detach before wakeup. s1 waits until wakeup, ignores the detach.
permutation wait1 detach2 wakeup2
# Detach before wait does not cause a wait, wakeup produces an error.
permutation detach2 wait1 wakeup2