]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Improve test case stability
authorÁlvaro Herrera <alvherre@kurilemu.de>
Tue, 25 Nov 2025 17:20:06 +0000 (18:20 +0100)
committerÁlvaro Herrera <alvherre@kurilemu.de>
Tue, 25 Nov 2025 17:20:06 +0000 (18:20 +0100)
Given unlucky timing, some of the new tests added by commit bc32a12e0db2
can fail spuriously.  We haven't seen such failures yet in buildfarm,
but allegedly we can prevent them with this tweak.

While at it, remove an unused injection point I (Álvaro) added.

Author: Mihail Nikalayeu <mihailnikalayeu@gmail.com>
Discussion: https://postgr.es/m/CADzfLwUc=jtSUEaQCtyt8zTeOJ-gHZ8=w_KJsVjDOYSLqaY9Lg@mail.gmail.com
Discussion: https://postgr.es/m/CADzfLwV5oQq-Vg_VmG_o4SdL6yHjDoNO4T4pMtgJLzYGmYf74g@mail.gmail.com

src/backend/executor/execIndexing.c
src/backend/utils/time/snapmgr.c
src/test/modules/injection_points/expected/index-concurrently-upsert-predicate.out
src/test/modules/injection_points/expected/index-concurrently-upsert.out
src/test/modules/injection_points/specs/index-concurrently-upsert-predicate.spec
src/test/modules/injection_points/specs/index-concurrently-upsert.spec

index d1cbab58799cdf92c94f9ce1a1d74337c24bca49..dd323c9b9fd42787ba1ca9e52c1b86349000c2f6 100644 (file)
@@ -945,9 +945,7 @@ retry:
        ExecDropSingleTupleTableSlot(existing_slot);
 
 #ifdef USE_INJECTION_POINTS
-       if (conflict)
-               INJECTION_POINT("check-exclusion-or-unique-constraint-conflict", NULL);
-       else
+       if (!conflict)
                INJECTION_POINT("check-exclusion-or-unique-constraint-no-conflict", NULL);
 #endif
 
index 24f73a49d27e2e0199cd7d387f6bf6b0ef728034..434abbf6b6f9984ee68043a709f106baaaf94bf2 100644 (file)
@@ -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);
        }
 }
index af602bdc048a37dae2a1845005df37181071dc2e..3d9512c8fc76cf0ae471fbd99c598af6d942292b 100644 (file)
@@ -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>
index eb6fd9592dfa93eb540a6442cc2d5cfd5055dc58..a9e8bb5d00ed3711ccfce8988c04854637266ea3 100644 (file)
@@ -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>
index 13897d88bce07e90f109ec17a33cfb138b227986..725f6f222951fee9ccbfbb27ff1678a333463b05 100644 (file)
@@ -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
index b07a6408b3b69595a27c9f91c6867b5d0905f39b..4487834aa8e06fa0b50da8e39d651bbb1320f236 100644 (file)
@@ -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