summaryrefslogtreecommitdiff
path: root/mysql-test
diff options
context:
space:
mode:
authorSergey Vojtovich <svoj@mariadb.org>2015-03-17 19:49:04 +0400
committerSergey Vojtovich <svoj@mariadb.org>2015-03-17 19:49:04 +0400
commit93e746afb2d1a23cb933291ad736a20858b5ac3e (patch)
tree261ec67df4329e6a7e6a62dfdf9e70887709ba24 /mysql-test
parentccc7297fe94af1129c717f91d31fa075d54a0371 (diff)
downloadmariadb-git-bb-mdev7793.tar.gz
MDEV-7793 - Race condition between XA COMMIT/ROLLBACK and disconnectbb-mdev7793
XA COMMIT/ROLLBACK of XA transaction owned by different thread may access freed memory if that thread disconnects at the same time. Also concurrent XA COMMIT/ROLLBACK of recovered XA transaction were not serialized properly.
Diffstat (limited to 'mysql-test')
-rw-r--r--mysql-test/r/xa_sync.result24
-rw-r--r--mysql-test/t/xa_sync.test46
2 files changed, 70 insertions, 0 deletions
diff --git a/mysql-test/r/xa_sync.result b/mysql-test/r/xa_sync.result
new file mode 100644
index 00000000000..769a13d1773
--- /dev/null
+++ b/mysql-test/r/xa_sync.result
@@ -0,0 +1,24 @@
+#
+# MDEV-7793 - Race condition between XA COMMIT/ROLLBACK and disconnect
+#
+# Note that this test is meaningful only with valgrind.
+XA START 'xatest';
+XA END 'xatest';
+XA PREPARE 'xatest';
+SET debug_sync='xa_after_search SIGNAL parked WAIT_FOR go';
+XA COMMIT 'xatest';
+SET debug_sync='now WAIT_FOR parked';
+# Waiting for thread to get deleted
+SET debug_sync='now SIGNAL go';
+ERROR XAE04: XAER_NOTA: Unknown XID
+SET debug_sync='RESET';
+XA START 'xatest';
+XA END 'xatest';
+XA PREPARE 'xatest';
+SET debug_sync='xa_after_search SIGNAL parked WAIT_FOR go';
+XA ROLLBACK 'xatest';
+SET debug_sync='now WAIT_FOR parked';
+# Waiting for thread to get deleted
+SET debug_sync='now SIGNAL go';
+ERROR XAE04: XAER_NOTA: Unknown XID
+SET debug_sync='RESET';
diff --git a/mysql-test/t/xa_sync.test b/mysql-test/t/xa_sync.test
new file mode 100644
index 00000000000..8a995c4a184
--- /dev/null
+++ b/mysql-test/t/xa_sync.test
@@ -0,0 +1,46 @@
+--source include/have_debug_sync.inc
+
+--echo #
+--echo # MDEV-7793 - Race condition between XA COMMIT/ROLLBACK and disconnect
+--echo #
+--echo # Note that this test is meaningful only with valgrind.
+let $op= XA COMMIT 'xatest';
+let $i= 2;
+while ($i)
+{
+ connect con1, localhost, root;
+ connect con2, localhost, root;
+
+ connection con1;
+ XA START 'xatest';
+ XA END 'xatest';
+ XA PREPARE 'xatest';
+
+ connection con2;
+ SET debug_sync='xa_after_search SIGNAL parked WAIT_FOR go';
+ send_eval $op;
+
+ connection default;
+ SET debug_sync='now WAIT_FOR parked';
+ disconnect con1;
+ disable_query_log;
+ echo # Waiting for thread to get deleted;
+ while (`SELECT VARIABLE_VALUE!=2 FROM INFORMATION_SCHEMA.SESSION_STATUS WHERE VARIABLE_NAME='max_used_connections'`)
+ {
+ real_sleep 0.1;
+ FLUSH STATUS;
+ }
+ enable_query_log;
+ SET debug_sync='now SIGNAL go';
+
+ connection con2;
+ --error ER_XAER_NOTA
+ reap;
+ disconnect con2;
+
+ connection default;
+ SET debug_sync='RESET';
+
+ let $op= XA ROLLBACK 'xatest';
+ dec $i;
+}