Hi all, This was on my TODO bucket for some time. The isolation test "inplace" in the isolation test suite for injection_points relies on a couple of behaviors implemented in the backend. One of them is that a point detach should not affect a wait. Rather than having to guess this stuff from the sole isolation test we have in this module, I would like to add a simple test to document all these assumptions.
This also works as a simple template for a newcomer willing to implement an isolation test with injection points. That's less intimidating than the inplace test with its VACUUM and GRANT interactions, based on an injection point run when updating the stats of a relation in VACUUM. Thoughts? -- Michael
From 4a0ffa49c7a7b1d3d3b878780aee6f536f38a68f Mon Sep 17 00:00:00 2001 From: Michael Paquier <mich...@paquier.xyz> Date: Fri, 18 Oct 2024 07:40:46 +0900 Subject: [PATCH] injection_points: Add basic isolation test This 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". Particularly, a detach should not affect a backend wait; a wait can should only be stopped by a wakeup. --- src/test/modules/injection_points/Makefile | 2 +- .../injection_points/expected/basic.out | 74 +++++++++++++++++++ src/test/modules/injection_points/meson.build | 1 + .../modules/injection_points/specs/basic.spec | 35 +++++++++ 4 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 src/test/modules/injection_points/expected/basic.out create mode 100644 src/test/modules/injection_points/specs/basic.spec diff --git a/src/test/modules/injection_points/Makefile b/src/test/modules/injection_points/Makefile index 8cb8c498e2..0753a9df58 100644 --- a/src/test/modules/injection_points/Makefile +++ b/src/test/modules/injection_points/Makefile @@ -13,7 +13,7 @@ PGFILEDESC = "injection_points - facility for injection points" REGRESS = injection_points reindex_conc REGRESS_OPTS = --dlpath=$(top_builddir)/src/test/regress -ISOLATION = inplace +ISOLATION = basic inplace TAP_TESTS = 1 diff --git a/src/test/modules/injection_points/expected/basic.out b/src/test/modules/injection_points/expected/basic.out new file mode 100644 index 0000000000..840ce2dac9 --- /dev/null +++ b/src/test/modules/injection_points/expected/basic.out @@ -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 diff --git a/src/test/modules/injection_points/meson.build b/src/test/modules/injection_points/meson.build index fdb5a25d7b..58f1900115 100644 --- a/src/test/modules/injection_points/meson.build +++ b/src/test/modules/injection_points/meson.build @@ -42,6 +42,7 @@ tests += { }, 'isolation': { 'specs': [ + 'basic', 'inplace', ], }, diff --git a/src/test/modules/injection_points/specs/basic.spec b/src/test/modules/injection_points/specs/basic.spec new file mode 100644 index 0000000000..ccd49e31ed --- /dev/null +++ b/src/test/modules/injection_points/specs/basic.spec @@ -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 wake. s1 waits until wakeup, ignores the detach. +permutation wait1 detach2 wakeup2 + +# Detach before wait does not cause a wait. +permutation detach2 wait1 wakeup2 -- 2.45.2
signature.asc
Description: PGP signature