mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
MDEV-35946 Assertion `thd->is_error()' failed in Sql_cmd_dml::prepare
Fix a regression that caused assertion thd->is_error() after
sync wait failures. If wsrep_sync_wait() fails make sure a appropriate
error is set. Partially revert 75dd0246f8.
Signed-off-by: Julius Goryavsky <julius.goryavsky@mariadb.com>
This commit is contained in:
parent
81e5077185
commit
10fd2c207a
3 changed files with 63 additions and 1 deletions
16
mysql-test/suite/galera/r/MDEV-35946.result
Normal file
16
mysql-test/suite/galera/r/MDEV-35946.result
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
connection node_2;
|
||||
connection node_1;
|
||||
connection node_1;
|
||||
connection node_2;
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
SET SESSION wsrep_sync_wait=DEFAULT;
|
||||
DELETE FROM mysql.wsrep_streaming_log;
|
||||
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
|
||||
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
VARIABLE_VALUE
|
||||
Primary
|
||||
SET SESSION wsrep_sync_wait=DEFAULT;
|
||||
CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender (.*) is not in state transfer \\(SYNCED\\)\\. Message ignored\\.");
|
||||
41
mysql-test/suite/galera/t/MDEV-35946.test
Normal file
41
mysql-test/suite/galera/t/MDEV-35946.test
Normal file
|
|
@ -0,0 +1,41 @@
|
|||
#
|
||||
# MDEV-35946: Assertion `thd->is_error()' failed in Sql_cmd_dml::prepare
|
||||
#
|
||||
--source include/have_innodb.inc
|
||||
--source include/galera_cluster.inc
|
||||
|
||||
# Save original auto_increment_offset values.
|
||||
--let $node_1=node_1
|
||||
--let $node_2=node_2
|
||||
--source include/auto_increment_offset_save.inc
|
||||
|
||||
#
|
||||
# Disconnect from the cluster
|
||||
#
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=1';
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'non-Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
--source include/wait_condition.inc
|
||||
SET SESSION wsrep_sync_wait=DEFAULT;
|
||||
|
||||
#
|
||||
# If bug is present, assertion will fire
|
||||
# during the execution of the following DELETE
|
||||
#
|
||||
--error ER_LOCK_WAIT_TIMEOUT
|
||||
DELETE FROM mysql.wsrep_streaming_log;
|
||||
|
||||
|
||||
#
|
||||
# Reconnect to the cluster
|
||||
#
|
||||
SET SESSION wsrep_sync_wait=0;
|
||||
SET GLOBAL wsrep_provider_options = 'gmcast.isolate=0';
|
||||
--let $wait_condition = SELECT VARIABLE_VALUE = 'Primary' FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
--source include/wait_condition.inc
|
||||
SELECT VARIABLE_VALUE FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME = 'wsrep_cluster_status';
|
||||
SET SESSION wsrep_sync_wait=DEFAULT;
|
||||
|
||||
|
||||
--source include/auto_increment_offset_restore.inc
|
||||
CALL mtr.add_suppression("WSREP: Protocol violation\\. JOIN message sender (.*) is not in state transfer \\(SYNCED\\)\\. Message ignored\\.");
|
||||
|
|
@ -1231,7 +1231,12 @@ bool wsrep_sync_wait (THD* thd, uint mask)
|
|||
This allows autocommit SELECTs and a first SELECT after SET AUTOCOMMIT=0
|
||||
TODO: modify to check if thd has locked any rows.
|
||||
*/
|
||||
return thd->wsrep_cs().sync_wait(-1);
|
||||
if (thd->wsrep_cs().sync_wait(-1))
|
||||
{
|
||||
wsrep_override_error(thd, thd->wsrep_cs().current_error(),
|
||||
thd->wsrep_cs().current_error_status());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue