Subject: Add isolation test template in injection_points for wait/wakeup/detach

From: Michael Paquier <[email-masked]>
Date: Fri, 18 Oct 2024 07:44:08 +0900

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 <[email-masked]>
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