On 2025-Nov-22, Mihail Nikalayeu wrote:

> 2) some updates for 0001 test stability (related to [0]).

This patch would bring the committed test file up to date with what you
last submitted.  However, I didn't understand what is the problem with
the original formulation, and I haven't seen the test fail ... can you
explain?


-- 
Álvaro Herrera         PostgreSQL Developer  —  https://www.EnterpriseDB.com/
"El número de instalaciones de UNIX se ha elevado a 10,
y se espera que este número aumente" (UPM, 1972)
>From dede9ad2366fb4987af96a8dd4d6a33e9f832676 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=C3=81lvaro=20Herrera?= <[email protected]>
Date: Mon, 24 Nov 2025 18:46:24 +0100
Subject: [PATCH] Improve test case stability

Author: Mihail Nikalayeu <[email protected]>
---
 src/backend/utils/time/snapmgr.c              |  1 +
 .../index-concurrently-upsert-predicate.out   | 11 +++++++---
 .../expected/index-concurrently-upsert.out    | 11 +++++++---
 .../index-concurrently-upsert-predicate.spec  | 21 ++++++++++++-------
 .../specs/index-concurrently-upsert.spec      | 19 +++++++++++------
 5 files changed, 44 insertions(+), 19 deletions(-)

diff --git a/src/backend/utils/time/snapmgr.c b/src/backend/utils/time/snapmgr.c
index 24f73a49d27..434abbf6b6f 100644
--- a/src/backend/utils/time/snapmgr.c
+++ b/src/backend/utils/time/snapmgr.c
@@ -459,6 +459,7 @@ InvalidateCatalogSnapshot(void)
                pairingheap_remove(&RegisteredSnapshots, 
&CatalogSnapshot->ph_node);
                CatalogSnapshot = NULL;
                SnapshotResetXmin();
+               INJECTION_POINT("pre-invalidate-catalog-snapshot-end", NULL);
                INJECTION_POINT("invalidate-catalog-snapshot-end", NULL);
        }
 }
diff --git 
a/src/test/modules/injection_points/expected/index-concurrently-upsert-predicate.out
 
b/src/test/modules/injection_points/expected/index-concurrently-upsert-predicate.out
index af602bdc048..3d9512c8fc7 100644
--- 
a/src/test/modules/injection_points/expected/index-concurrently-upsert-predicate.out
+++ 
b/src/test/modules/injection_points/expected/index-concurrently-upsert-predicate.out
@@ -1,6 +1,6 @@
-Parsed test spec with 4 sessions
+Parsed test spec with 5 sessions
 
-starting permutation: s3_start_create_index s1_start_upsert 
s4_wakeup_define_index_before_set_valid s2_start_upsert 
s4_wakeup_s1_from_invalidate_catalog_snapshot s4_wakeup_s2 s4_wakeup_s1
+starting permutation: s5_noop s3_start_create_index s1_start_upsert 
s4_wakeup_define_index_before_set_valid s2_start_upsert 
s5_wakeup_s1_from_invalidate_catalog_snapshot s4_wakeup_s2 s4_wakeup_s1
 injection_points_attach
 -----------------------
                        
@@ -16,12 +16,16 @@ injection_points_attach
                        
 (1 row)
 
+step s5_noop: 
+ <waiting ...>
 step s3_start_create_index: 
        CREATE UNIQUE INDEX CONCURRENTLY tbl_pkey_special_duplicate ON 
test.tbl(abs(i)) WHERE i < 10000;
  <waiting ...>
+s1: NOTICE:  notice triggered for injection point 
pre-invalidate-catalog-snapshot-end
 step s1_start_upsert: 
        INSERT INTO test.tbl VALUES(13,now()) ON CONFLICT (abs(i)) WHERE i < 
100 DO UPDATE SET updated_at = now();
  <waiting ...>
+step s5_noop: <... completed>
 step s4_wakeup_define_index_before_set_valid: 
        SELECT injection_points_detach('define-index-before-set-valid');
        SELECT injection_points_wakeup('define-index-before-set-valid');
@@ -39,7 +43,7 @@ injection_points_wakeup
 step s2_start_upsert: 
        INSERT INTO test.tbl VALUES(13,now()) ON CONFLICT (abs(i)) WHERE i < 
100 DO UPDATE SET updated_at = now();
  <waiting ...>
-step s4_wakeup_s1_from_invalidate_catalog_snapshot: 
+step s5_wakeup_s1_from_invalidate_catalog_snapshot: 
        SELECT injection_points_detach('invalidate-catalog-snapshot-end');
        SELECT injection_points_wakeup('invalidate-catalog-snapshot-end');
 
@@ -81,6 +85,7 @@ injection_points_wakeup
                        
 (1 row)
 
+s1: NOTICE:  notice triggered for injection point 
pre-invalidate-catalog-snapshot-end
 step s1_start_upsert: <... completed>
 step s2_start_upsert: <... completed>
 step s3_start_create_index: <... completed>
diff --git 
a/src/test/modules/injection_points/expected/index-concurrently-upsert.out 
b/src/test/modules/injection_points/expected/index-concurrently-upsert.out
index eb6fd9592df..a9e8bb5d00e 100644
--- a/src/test/modules/injection_points/expected/index-concurrently-upsert.out
+++ b/src/test/modules/injection_points/expected/index-concurrently-upsert.out
@@ -1,6 +1,6 @@
-Parsed test spec with 4 sessions
+Parsed test spec with 5 sessions
 
-starting permutation: s3_start_create_index s1_start_upsert 
s4_wakeup_define_index_before_set_valid s2_start_upsert 
s4_wakeup_s1_from_invalidate_catalog_snapshot s4_wakeup_s2 s4_wakeup_s1
+starting permutation: s5_noop s3_start_create_index s1_start_upsert 
s4_wakeup_define_index_before_set_valid s2_start_upsert 
s5_wakeup_s1_from_invalidate_catalog_snapshot s4_wakeup_s2 s4_wakeup_s1
 injection_points_attach
 -----------------------
                        
@@ -16,12 +16,16 @@ injection_points_attach
                        
 (1 row)
 
+step s5_noop: 
+ <waiting ...>
 step s3_start_create_index: 
        CREATE UNIQUE INDEX CONCURRENTLY tbl_pkey_duplicate ON test.tbl(i);
  <waiting ...>
+s1: NOTICE:  notice triggered for injection point 
pre-invalidate-catalog-snapshot-end
 step s1_start_upsert: 
     INSERT INTO test.tbl VALUES (13,now()) ON CONFLICT (i) DO UPDATE SET 
updated_at = now();
  <waiting ...>
+step s5_noop: <... completed>
 step s4_wakeup_define_index_before_set_valid: 
        SELECT injection_points_detach('define-index-before-set-valid');
        SELECT injection_points_wakeup('define-index-before-set-valid');
@@ -39,7 +43,7 @@ injection_points_wakeup
 step s2_start_upsert: 
        INSERT INTO test.tbl VALUES (13,now()) ON CONFLICT (i) DO UPDATE SET 
updated_at = now();
  <waiting ...>
-step s4_wakeup_s1_from_invalidate_catalog_snapshot: 
+step s5_wakeup_s1_from_invalidate_catalog_snapshot: 
        SELECT injection_points_detach('invalidate-catalog-snapshot-end');
        SELECT injection_points_wakeup('invalidate-catalog-snapshot-end');
 
@@ -81,6 +85,7 @@ injection_points_wakeup
                        
 (1 row)
 
+s1: NOTICE:  notice triggered for injection point 
pre-invalidate-catalog-snapshot-end
 step s1_start_upsert: <... completed>
 step s2_start_upsert: <... completed>
 step s3_start_create_index: <... completed>
diff --git 
a/src/test/modules/injection_points/specs/index-concurrently-upsert-predicate.spec
 
b/src/test/modules/injection_points/specs/index-concurrently-upsert-predicate.spec
index 13897d88bce..725f6f22295 100644
--- 
a/src/test/modules/injection_points/specs/index-concurrently-upsert-predicate.spec
+++ 
b/src/test/modules/injection_points/specs/index-concurrently-upsert-predicate.spec
@@ -5,7 +5,7 @@
 # - s2: UPSERT the same tuple
 # - s3: CREATE UNIQUE INDEX CONCURRENTLY (with a predicate)
 #
-# - s4: control concurrency via injection points
+# - s4 and s5: control concurrency via injection points
 
 setup
 {
@@ -27,6 +27,7 @@ setup
 {
        SELECT injection_points_set_local();
        SELECT 
injection_points_attach('check-exclusion-or-unique-constraint-no-conflict', 
'wait');
+       SELECT injection_points_attach('pre-invalidate-catalog-snapshot-end', 
'notice');
        SELECT injection_points_attach('invalidate-catalog-snapshot-end', 
'wait');
 }
 step s1_start_upsert
@@ -62,11 +63,6 @@ step s4_wakeup_s1
        SELECT 
injection_points_detach('check-exclusion-or-unique-constraint-no-conflict');
        SELECT 
injection_points_wakeup('check-exclusion-or-unique-constraint-no-conflict');
 }
-step s4_wakeup_s1_from_invalidate_catalog_snapshot
-{
-       SELECT injection_points_detach('invalidate-catalog-snapshot-end');
-       SELECT injection_points_wakeup('invalidate-catalog-snapshot-end');
-}
 step s4_wakeup_s2
 {
        SELECT injection_points_detach('exec-insert-before-insert-speculative');
@@ -78,11 +74,22 @@ step s4_wakeup_define_index_before_set_valid
        SELECT injection_points_wakeup('define-index-before-set-valid');
 }
 
+session s5
+step s5_noop
+{
+}
+step s5_wakeup_s1_from_invalidate_catalog_snapshot
+{
+       SELECT injection_points_detach('invalidate-catalog-snapshot-end');
+       SELECT injection_points_wakeup('invalidate-catalog-snapshot-end');
+}
+
 permutation
+       s5_noop(s1_start_upsert notices 1)
        s3_start_create_index(s1_start_upsert, s2_start_upsert)
        s1_start_upsert
        s4_wakeup_define_index_before_set_valid
        s2_start_upsert(s1_start_upsert)
-       s4_wakeup_s1_from_invalidate_catalog_snapshot
+       s5_wakeup_s1_from_invalidate_catalog_snapshot
        s4_wakeup_s2
        s4_wakeup_s1
diff --git 
a/src/test/modules/injection_points/specs/index-concurrently-upsert.spec 
b/src/test/modules/injection_points/specs/index-concurrently-upsert.spec
index b07a6408b3b..4487834aa8e 100644
--- a/src/test/modules/injection_points/specs/index-concurrently-upsert.spec
+++ b/src/test/modules/injection_points/specs/index-concurrently-upsert.spec
@@ -26,6 +26,7 @@ setup
 {
        SELECT injection_points_set_local();
        SELECT 
injection_points_attach('check-exclusion-or-unique-constraint-no-conflict', 
'wait');
+       SELECT injection_points_attach('pre-invalidate-catalog-snapshot-end', 
'notice');
        SELECT injection_points_attach('invalidate-catalog-snapshot-end', 
'wait');
 }
 step s1_start_upsert
@@ -61,11 +62,6 @@ step s4_wakeup_s1
        SELECT 
injection_points_detach('check-exclusion-or-unique-constraint-no-conflict');
        SELECT 
injection_points_wakeup('check-exclusion-or-unique-constraint-no-conflict');
 }
-step s4_wakeup_s1_from_invalidate_catalog_snapshot
-{
-       SELECT injection_points_detach('invalidate-catalog-snapshot-end');
-       SELECT injection_points_wakeup('invalidate-catalog-snapshot-end');
-}
 step s4_wakeup_s2
 {
        SELECT injection_points_detach('exec-insert-before-insert-speculative');
@@ -77,11 +73,22 @@ step s4_wakeup_define_index_before_set_valid
        SELECT injection_points_wakeup('define-index-before-set-valid');
 }
 
+session s5
+step s5_noop
+{
+}
+step s5_wakeup_s1_from_invalidate_catalog_snapshot
+{
+       SELECT injection_points_detach('invalidate-catalog-snapshot-end');
+       SELECT injection_points_wakeup('invalidate-catalog-snapshot-end');
+}
+
 permutation
+       s5_noop(s1_start_upsert notices 1)
        s3_start_create_index(s1_start_upsert, s2_start_upsert)
        s1_start_upsert
        s4_wakeup_define_index_before_set_valid
        s2_start_upsert(s1_start_upsert)
-       s4_wakeup_s1_from_invalidate_catalog_snapshot
+       s5_wakeup_s1_from_invalidate_catalog_snapshot
        s4_wakeup_s2
        s4_wakeup_s1
-- 
2.47.3

Reply via email to