55 lines
1.8 KiB
Ruby
55 lines
1.8 KiB
Ruby
# Test for interactions between SSI's "conflict out" handling for heapam and
|
|
# concurrently updated tuple
|
|
#
|
|
# See bug report:
|
|
# https://postgr.es/m/db7b729d-0226-d162-a126-8a8ab2dc4443%40jepsen.io
|
|
|
|
setup
|
|
{
|
|
CREATE TABLE txn0(id int4 PRIMARY KEY, val TEXT);
|
|
CREATE TABLE txn1(id int4 PRIMARY KEY, val TEXT);
|
|
}
|
|
|
|
teardown
|
|
{
|
|
DROP TABLE txn0;
|
|
DROP TABLE txn1;
|
|
}
|
|
|
|
session foo
|
|
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; }
|
|
step foo_select { SELECT * FROM txn0 WHERE id = 42; }
|
|
step foo_insert { INSERT INTO txn1 SELECT 7, 'foo_insert'; }
|
|
step foo_commit { COMMIT; }
|
|
|
|
session bar
|
|
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; }
|
|
step bar_select { SELECT * FROM txn1 WHERE id = 7; }
|
|
step bar_insert { INSERT INTO txn0 SELECT 42, 'bar_insert'; }
|
|
step bar_commit { COMMIT; }
|
|
|
|
# This session creates the conditions that confused bar's "conflict out"
|
|
# handling in old releases affected by bug:
|
|
session trouble
|
|
setup { BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE; }
|
|
step trouble_update { UPDATE txn1 SET val = 'add physical version for "bar_select"' WHERE id = 7; }
|
|
step trouble_delete { DELETE FROM txn1 WHERE id = 7; }
|
|
step trouble_abort { ABORT; }
|
|
|
|
permutation foo_select
|
|
bar_insert
|
|
foo_insert foo_commit
|
|
trouble_update # Updates tuple...
|
|
bar_select # Should observe one distinct XID per version
|
|
bar_commit # "bar" should fail here at the latest
|
|
trouble_abort
|
|
|
|
# Same as above, but "trouble" session DELETEs this time around
|
|
permutation foo_select
|
|
bar_insert
|
|
foo_insert foo_commit
|
|
trouble_delete # Deletes tuple...
|
|
bar_select # Should observe foo's XID
|
|
bar_commit # "bar" should fail here at the latest
|
|
trouble_abort
|