summaryrefslogtreecommitdiffstats
path: root/src/test/isolation/specs/update-conflict-out.spec
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/isolation/specs/update-conflict-out.spec')
-rw-r--r--src/test/isolation/specs/update-conflict-out.spec54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/test/isolation/specs/update-conflict-out.spec b/src/test/isolation/specs/update-conflict-out.spec
new file mode 100644
index 0000000..8aad6aa
--- /dev/null
+++ b/src/test/isolation/specs/update-conflict-out.spec
@@ -0,0 +1,54 @@
+# 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