diff options
author | Jan Lindström <jan.lindstrom@mariadb.com> | 2019-12-31 08:26:46 +0200 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2019-12-31 08:26:46 +0200 |
commit | 0a1d31c8e83197bb7d3aa6a985ce53cc40dd014b (patch) | |
tree | 0c573a72a9f8fc1aa29ae5b648eaeb592af7f7f5 | |
parent | 59d4f2a373a7960a533e653877ab69a97e91444a (diff) | |
parent | ad0eed870082ee6e7bc5193a68a66be0256b5458 (diff) | |
download | mariadb-git-bb-10.4-MDEV-20793.tar.gz |
Merge branch 'codership-10.4-MDEV-20793' into 10.4bb-10.4-MDEV-20793
-rw-r--r-- | mysql-test/suite/galera/r/MDEV-20793.result | 39 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/MDEV-20793.test | 75 | ||||
-rw-r--r-- | sql/wsrep_high_priority_service.cc | 4 | ||||
m--------- | wsrep-lib | 0 |
4 files changed, 115 insertions, 3 deletions
diff --git a/mysql-test/suite/galera/r/MDEV-20793.result b/mysql-test/suite/galera/r/MDEV-20793.result new file mode 100644 index 00000000000..b420c8720f5 --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-20793.result @@ -0,0 +1,39 @@ +connection node_2; +connection node_1; +CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 INT); +INSERT INTO t1 VALUES (1, 0), (5, 0); +connection node_1_ctrl; +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_slave_threads = 2; +connection node_1; +SET SESSION wsrep_retry_autocommit = 0; +START TRANSACTION; +UPDATE t1 SET f2 = 1; +SET SESSION debug_sync = "wsrep_before_replay SIGNAL reached WAIT_FOR continue"; +connection node_1_ctrl; +SET GLOBAL wsrep_provider_options = 'dbug=d,apply_monitor_slave_enter_sync'; +connection node_2; +INSERT INTO t1 VALUES (2, 2); +connection node_1_ctrl; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET GLOBAL wsrep_provider_options = 'dbug=d,local_monitor_slave_enter_sync'; +connection node_2; +UPDATE t1 SET f2 = 2 WHERE f1 = 5; +connection node_1_ctrl; +SET SESSION wsrep_on = 0; +SET SESSION wsrep_on = 1; +connection node_1; +COMMIT; +connection node_1_ctrl; +SET GLOBAL wsrep_provider_options = 'signal=apply_monitor_slave_enter_sync'; +SET SESSION debug_sync = "now WAIT_FOR reached"; +SET GLOBAL wsrep_provider_options = 'signal=local_monitor_slave_enter_sync'; +SET GLOBAL wsrep_provider_options = 'dbug='; +SET SESSION debug_sync = "now SIGNAL continue"; +connection node_1; +ERROR 40001: Deadlock found when trying to get lock; try restarting transaction +SET debug_sync = "RESET"; +DROP TABLE t1; +SET GLOBAL wsrep_slave_threads = 1; diff --git a/mysql-test/suite/galera/t/MDEV-20793.test b/mysql-test/suite/galera/t/MDEV-20793.test new file mode 100644 index 00000000000..b43f5c74c5e --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-20793.test @@ -0,0 +1,75 @@ +# +# MDEV-20793 Assertion after certification failure during replay. +# +# The test outline: +# In order to produce certification failure three transactions +# are needed. One transaction is executing on node_1 and two others +# on node_2. The first transaction from node_2 BF aborts the transaction +# on node_1, but does not cause certification conflict. The second +# transaction from node_2 will cause conflict and the transaction on +# node_1 fails in certification during replay. +# + +--source include/galera_cluster.inc + +CREATE TABLE t1 (f1 INT PRIMARY KEY, f2 INT); +INSERT INTO t1 VALUES (1, 0), (5, 0); + +--let galera_connection_name = node_1_ctrl +--let galera_server_number = 1 +--source include/galera_connect.inc +--connection node_1_ctrl +SET SESSION wsrep_sync_wait = 0; +SET GLOBAL wsrep_slave_threads = 2; + +--connection node_1 +# Start transaction which takes gap lock 1 - 5 +SET SESSION wsrep_retry_autocommit = 0; +START TRANSACTION; +UPDATE t1 SET f2 = 1; +SET SESSION debug_sync = "wsrep_before_replay SIGNAL reached WAIT_FOR continue"; + +--connection node_1_ctrl +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +--connection node_2 +# Insert into gap from other node. This generates BF abort but does not +# conflict with update. +INSERT INTO t1 VALUES (2, 2); + +--connection node_1_ctrl +--source include/galera_wait_sync_point.inc +--source include/galera_clear_sync_point.inc +--let $galera_sync_point = local_monitor_slave_enter_sync +--source include/galera_set_sync_point.inc + +# Make an update which will conflict with update on node_1 +--connection node_2 +UPDATE t1 SET f2 = 2 WHERE f1 = 5; + +--connection node_1_ctrl +--let $galera_sync_point = apply_monitor_slave_enter_sync local_monitor_slave_enter_sync +--source include/galera_wait_sync_point.inc + +--connection node_1 +--send COMMIT + +--connection node_1_ctrl +--let $galera_sync_point = apply_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +SET SESSION debug_sync = "now WAIT_FOR reached"; + +--let $galera_sync_point = local_monitor_slave_enter_sync +--source include/galera_signal_sync_point.inc +--source include/galera_clear_sync_point.inc +SET SESSION debug_sync = "now SIGNAL continue"; + +--connection node_1 +--error ER_LOCK_DEADLOCK +--reap + +SET debug_sync = "RESET"; + +DROP TABLE t1; +SET GLOBAL wsrep_slave_threads = 1; diff --git a/sql/wsrep_high_priority_service.cc b/sql/wsrep_high_priority_service.cc index fa62ada6666..e668a57dc96 100644 --- a/sql/wsrep_high_priority_service.cc +++ b/sql/wsrep_high_priority_service.cc @@ -598,9 +598,7 @@ Wsrep_replayer_service::~Wsrep_replayer_service() THD* replayer_thd= m_thd; THD* orig_thd= m_orig_thd; - /* Store replay result/state to original thread wsrep client - state and switch execution context back to original. */ - orig_thd->wsrep_cs().after_replay(replayer_thd->wsrep_trx()); + /* Switch execution context back to original. */ wsrep_after_apply(replayer_thd); wsrep_after_command_ignore_result(replayer_thd); wsrep_close(replayer_thd); diff --git a/wsrep-lib b/wsrep-lib -Subproject 90157ed1b0f8b3f0d1eb3d60ac93ce6d8da7ad7 +Subproject 76f7249b8df209a2a3cefd7d4bbf31f6c72812f |