Add isolationtester spec for old heapam.c bug

In 0e5680f473, 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
38f8bdcac4 is in the tree, we can have this spec file too.

Discussion: https://www.postgresql.org/message-id/20141212205254.GC1768%40alvh.no-ip.org
This commit is contained in:
Alvaro Herrera 2016-02-26 17:11:15 -03:00
parent 74d58425c7
commit c9578135f7
3 changed files with 53 additions and 0 deletions

View File

@ -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;

View File

@ -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

View File

@ -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"