mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
BUG#37145 Killing a statement doing DDL may log binlog event with error code 1053
When the thread executing a DDL was killed after finished its execution but before writing the binlog event, the error code in the binlog event could be set wrongly to ER_SERVER_SHUTDOWN or ER_QUERY_INTERRUPTED. This patch fixed the problem by ignoring the kill status when constructing the event for DDL statements. This patch also included the following changes in order to provide the test case. 1) modified mysqltest to support variable for connection command 2) modified mysql-test-run.pl, add new variable MYSQL_SLAVE to run mysql client against the slave mysqld.
This commit is contained in:
21
mysql-test/include/diff_master_slave.inc
Normal file
21
mysql-test/include/diff_master_slave.inc
Normal file
@ -0,0 +1,21 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Diff the output of a statement on master and slave
|
||||
#
|
||||
# ==== Usage =====
|
||||
#
|
||||
# let $diff_statement= SELECT * FROM t1 WHERE a < 100;
|
||||
# source include/diff_master_slave.inc;
|
||||
|
||||
--echo source include/diff_master_slave.inc;
|
||||
disable_query_log;
|
||||
disable_result_log;
|
||||
|
||||
exec $MYSQL test -e "$diff_statement" > $MYSQLTEST_VARDIR/tmp/diff_master.out;
|
||||
sync_slave_with_master;
|
||||
exec $MYSQL_SLAVE test -e "$diff_statement" > $MYSQLTEST_VARDIR/tmp/diff_slave.out;
|
||||
|
||||
diff_files $MYSQLTEST_VARDIR/tmp/diff_master.out $MYSQLTEST_VARDIR/tmp/diff_slave.out;
|
||||
|
||||
enable_result_log;
|
||||
enable_query_log;
|
68
mysql-test/include/kill_query.inc
Normal file
68
mysql-test/include/kill_query.inc
Normal file
@ -0,0 +1,68 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Kill a query in the master connection, and then try to reap the
|
||||
# result of the killed query.
|
||||
#
|
||||
# ==== Usage ====
|
||||
#
|
||||
# The following variables should be set before sourcing this file.
|
||||
#
|
||||
# $debug_lock: name of the debug user lock, if set, will release/lock
|
||||
# the specified debug lock accordingly, and before
|
||||
# sourcing this, connection 'master' should get the user
|
||||
# lock and run a query in another thread, which will
|
||||
# block before creating statement event.
|
||||
#
|
||||
# $connection_name: name of the connection that is waiting for the
|
||||
# lock, this can not be 'master'
|
||||
#
|
||||
# $connection_id: id of the connection that is waiting for the lock
|
||||
#
|
||||
# Example:
|
||||
# let $debug_lock=;
|
||||
# connection master1;
|
||||
# let $connection_name= master1;
|
||||
# let $connection_id= `SELECT CONNECTION_ID()`;
|
||||
# send CREATE TABLE t1;
|
||||
# source kill_query.inc;
|
||||
#
|
||||
# let $debug_lock= "debug_lock.before_query_log_event";
|
||||
# connection master;
|
||||
# eval SELECT GET_LOCK($debug_lock, 10);
|
||||
# connection master1;
|
||||
# let $connection_name= master1;
|
||||
# let $connection_id= `SELECT CONNECTION_ID()`;
|
||||
# send CREATE TABLE t1;
|
||||
# source kill_query.inc;
|
||||
|
||||
|
||||
--echo source include/kill_query.inc;
|
||||
disable_query_log;
|
||||
disable_result_log;
|
||||
connection master;
|
||||
|
||||
# kill the query that is waiting
|
||||
eval kill query $connection_id;
|
||||
|
||||
if (`SELECT '$debug_lock' != ''`)
|
||||
{
|
||||
# release the lock to allow binlog continue
|
||||
eval SELECT RELEASE_LOCK($debug_lock);
|
||||
}
|
||||
|
||||
# reap the result of the waiting query
|
||||
connection $connection_name;
|
||||
error 0, 1317, 1307, 1306, 1334, 1305;
|
||||
reap;
|
||||
|
||||
connection master;
|
||||
|
||||
if (`SELECT '$debug_lock' != ''`)
|
||||
{
|
||||
# get lock again to make the next query wait
|
||||
eval SELECT GET_LOCK($debug_lock, 10);
|
||||
}
|
||||
|
||||
connection $connection_name;
|
||||
enable_query_log;
|
||||
enable_result_log;
|
43
mysql-test/include/kill_query_and_diff_master_slave.inc
Normal file
43
mysql-test/include/kill_query_and_diff_master_slave.inc
Normal file
@ -0,0 +1,43 @@
|
||||
# ==== Purpose ====
|
||||
#
|
||||
# Kill a query, sync master with slave, and diff the output of a
|
||||
# statement on master and slave to check if statement is correctly
|
||||
# replicated.
|
||||
#
|
||||
# ==== Usage ====
|
||||
#
|
||||
# connection <CONNECTION>;
|
||||
# let $connection_name=<CONNECTION>
|
||||
# let $connection_id=`SELECT CONNECTION_ID()`;
|
||||
# let $diff_statement=<SQL COMMAND>;
|
||||
# send <SQL COMMAND>;
|
||||
# source include/kill_query_and_diff_master_slave.inc;
|
||||
#
|
||||
# Note: <CONNECTION> must not be 'master'.
|
||||
#
|
||||
# See also kill_query.inc and diff_master_slave.inc for more
|
||||
# information
|
||||
|
||||
source include/kill_query.inc;
|
||||
|
||||
# Release the debug lock if used, so that the statements in
|
||||
# diff_master_slave.inc will not be blocked.
|
||||
connection master;
|
||||
disable_query_log;
|
||||
disable_result_log;
|
||||
if (`SELECT '$debug_lock' != ''`)
|
||||
{
|
||||
eval SELECT RELEASE_LOCK($debug_lock);
|
||||
}
|
||||
enable_result_log;
|
||||
enable_query_log;
|
||||
|
||||
source include/diff_master_slave.inc;
|
||||
|
||||
# Acquire the debug lock again if used
|
||||
connection master;
|
||||
disable_query_log; disable_result_log; if (`SELECT '$debug_lock' !=
|
||||
''`) { eval SELECT GET_LOCK($debug_lock, 10); } enable_result_log;
|
||||
enable_query_log;
|
||||
|
||||
connection $connection_name;
|
Reference in New Issue
Block a user