summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlvaro Herrera2016-02-26 20:11:15 +0000
committerAlvaro Herrera2016-02-26 20:11:15 +0000
commitc9578135f769072e2597b88402f256a398279c91 (patch)
tree1e3e2c7d030efb176e3bce875824a57119a17c4d
parent74d58425c70f9f7f1cb5d7f428ceaa1b56aa081d (diff)
Add isolationtester spec for old heapam.c bug
In 0e5680f4737a, I fixed a bug in heapam that caused spurious deadlocks when multiple updates concurrently attempted to modify the old version of an updated tuple whose new version was key-share locked. I proposed an isolationtester spec file that reproduced the bug, but back then isolationtester wasn't mature enough to be able to run it. Now that 38f8bdcac498 is in the tree, we can have this spec file too. Discussion: https://www.postgresql.org/message-id/20141212205254.GC1768%40alvh.no-ip.org
-rw-r--r--src/test/isolation/expected/tuplelock-update.out24
-rw-r--r--src/test/isolation/isolation_schedule1
-rw-r--r--src/test/isolation/specs/tuplelock-update.spec28
3 files changed, 53 insertions, 0 deletions
diff --git a/src/test/isolation/expected/tuplelock-update.out b/src/test/isolation/expected/tuplelock-update.out
new file mode 100644
index 00000000000..43754e0715b
--- /dev/null
+++ b/src/test/isolation/expected/tuplelock-update.out
@@ -0,0 +1,24 @@
+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
+
+
+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 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);
+pg_advisory_unlock
+
+t
+step s2_update: <... completed>
+step s3_update: <... completed>
+step s4_update: <... completed>
+step s1_commit: COMMIT;
diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule
index fcde38ce452..138a0b762df 100644
--- a/src/test/isolation/isolation_schedule
+++ b/src/test/isolation/isolation_schedule
@@ -31,6 +31,7 @@ test: multixact-no-deadlock
test: multixact-no-forget
test: propagate-lock-delete
test: tuplelock-conflict
+test: tuplelock-update
test: nowait
test: nowait-2
test: nowait-3
diff --git a/src/test/isolation/specs/tuplelock-update.spec b/src/test/isolation/specs/tuplelock-update.spec
new file mode 100644
index 00000000000..d93e883ebbc
--- /dev/null
+++ b/src/test/isolation/specs/tuplelock-update.spec
@@ -0,0 +1,28 @@
+setup {
+ DROP TABLE IF EXISTS pktab;
+ CREATE TABLE pktab (id int PRIMARY KEY, data SERIAL NOT NULL);
+ INSERT INTO pktab VALUES (1, DEFAULT);
+}
+
+teardown {
+ DROP TABLE pktab;
+}
+
+session "s1"
+step "s1_advlock" { SELECT pg_advisory_lock(142857); }
+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_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; }
+
+session "s4"
+step "s4_update" { UPDATE pktab SET data = DEFAULT WHERE pg_advisory_lock_shared(142857) IS NOT NULL; }
+
+permutation "s1_advlock" "s2_update" "s3_update" "s4_update" "s1_chain" "s1_begin" "s1_grablock" "s1_advunlock" "s1_commit"