Make new isolationtester test more stable
authorAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 29 Feb 2016 19:28:54 +0000 (16:28 -0300)
committerAlvaro Herrera <alvherre@alvh.no-ip.org>
Mon, 29 Feb 2016 19:34:56 +0000 (16:34 -0300)
The original coding of the test was relying too much on the ordering in
which backends are awakened once an advisory lock which they wait for is
released.  Change the code so that each backend uses its own advisory
lock instead, so that the output becomes stable.  Also add a few seconds
of sleep between lock releases, so that the test isn't broken in
overloaded buildfarm animals, as suggested by Tom Lane.

Per buildfarm members spoonbill and guaibasaurus.

Discussion: https://www.postgresql.org/message-id/19294.1456551587%40sss.pgh.pa.us

src/test/isolation/expected/tuplelock-update.out
src/test/isolation/specs/tuplelock-update.spec

index 43754e0715b9a149fb98e6825b6762b9dae4ddc5..ea63022e9346745da222b3dfdf1705095d1a2d7d 100644 (file)
@@ -1,24 +1,36 @@
 Parsed test spec with 4 sessions
 
-starting permutation: s1_advlock s2_update s3_update s4_update s1_chain s1_begin s1_grablock s1_advunlock s1_commit
-step s1_advlock: SELECT pg_advisory_lock(142857);
-pg_advisory_lock
+starting permutation: s1_advlock s2_update s3_update s4_update s1_chain s1_begin s1_grablock s1_advunlock1 s1_advunlock2 s1_advunlock3 s1_commit
+step s1_advlock: 
+    SELECT pg_advisory_lock(142857),
+        pg_advisory_lock(285714),
+        pg_advisory_lock(571428);
 
-               
+pg_advisory_lockpg_advisory_lockpg_advisory_lock
+
+                                             
 step s2_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; <waiting ...>
-step s3_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; <waiting ...>
-step s4_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; <waiting ...>
+step s3_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(285714) IS NOT NULL; <waiting ...>
+step s4_update: UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(571428) IS NOT NULL; <waiting ...>
 step s1_chain: UPDATE pktab SET data = DEFAULT;
 step s1_begin: BEGIN;
 step s1_grablock: SELECT * FROM pktab FOR KEY SHARE;
 id             data           
 
 1              2              
-step s1_advunlock: SELECT pg_advisory_unlock(142857);
+step s1_advunlock1: SELECT pg_advisory_unlock(142857);
 pg_advisory_unlock
 
 t              
 step s2_update: <... completed>
+step s1_advunlock2: SELECT pg_sleep(5), pg_advisory_unlock(285714);
+pg_sleep       pg_advisory_unlock
+
+               t              
 step s3_update: <... completed>
+step s1_advunlock3: SELECT pg_sleep(5), pg_advisory_unlock(571428);
+pg_sleep       pg_advisory_unlock
+
+               t              
 step s4_update: <... completed>
 step s1_commit: COMMIT;
index d93e883ebbc8186cb7bdaeb61a33f6eadbb09949..8f5a1f7314ad5537a3719a786897d2b9762a4962 100644 (file)
@@ -9,20 +9,26 @@ teardown {
 }
 
 session "s1"
-step "s1_advlock" { SELECT pg_advisory_lock(142857); }
+step "s1_advlock" {
+    SELECT pg_advisory_lock(142857),
+        pg_advisory_lock(285714),
+        pg_advisory_lock(571428);
+ }
 step "s1_chain" { UPDATE pktab SET data = DEFAULT; }
 step "s1_begin" { BEGIN; }
 step "s1_grablock" { SELECT * FROM pktab FOR KEY SHARE; }
-step "s1_advunlock" { SELECT pg_advisory_unlock(142857); }
+step "s1_advunlock1" { SELECT pg_advisory_unlock(142857); }
+step "s1_advunlock2" { SELECT pg_sleep(5), pg_advisory_unlock(285714); }
+step "s1_advunlock3" { SELECT pg_sleep(5), pg_advisory_unlock(571428); }
 step "s1_commit" { COMMIT; }
 
 session "s2"
 step "s2_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; }
 
 session "s3"
-step "s3_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; }
+step "s3_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(285714) IS NOT NULL; }
 
 session "s4"
-step "s4_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; }
+step "s4_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(571428) IS NOT NULL; }
 
-permutation "s1_advlock" "s2_update" "s3_update" "s4_update" "s1_chain" "s1_begin" "s1_grablock" "s1_advunlock" "s1_commit"
+permutation "s1_advlock" "s2_update" "s3_update" "s4_update" "s1_chain" "s1_begin" "s1_grablock" "s1_advunlock1" "s1_advunlock2" "s1_advunlock3" "s1_commit"