mirror of
https://github.com/MariaDB/server.git
synced 2025-01-24 07:44:22 +01:00
211552ccee
replication aborts When recieving a 'SLAVE STOP' command, slave SQL thread will roll back the transaction and stop immidiately if there is only transactional table updated, even through 'CREATE|DROP TEMPOARY TABLE' statement are in it. But These statements can never be rolled back. Because the temporary tables to the user session mapping remain until 'RESET SLAVE', Therefore it will abort SQL thread with an error that the table already exists or doesn't exist, when it restarts and executes the whole transaction again. After this patch, SQL thread always waits till the transaction ends and then stops, if 'CREATE|DROP TEMPOARY TABLE' statement are in it. mysql-test/extra/rpl_tests/rpl_stop_slave.test: Auxiliary file which is used to test this bug. mysql-test/suite/rpl/t/rpl_stop_slave.test: Test case for this bug. sql/slave.cc: Checking if OPTION_KEEP_LOG is set. If it is set, SQL thread should wait until the transaction ends. sql/sql_parse.cc: Add a debug point for testing this bug.
61 lines
1.3 KiB
Text
61 lines
1.3 KiB
Text
#
|
|
# Auxiliary file which is used to test BUG#56118
|
|
#
|
|
# Slave should apply all statements in the transaction before stop if any
|
|
# temporary table is created or dropped.
|
|
#
|
|
# USEAGE:
|
|
# --let $tmp_table_stm= a SQL statement
|
|
# --source extra/rpl_tests/rpl_stop_slave.test
|
|
#
|
|
|
|
if (`SELECT "$tmp_table_stm" = ''`)
|
|
{
|
|
--echo \$tmp_table_stm is NULL
|
|
--die $tmp_table_stm is NULL
|
|
}
|
|
|
|
--echo
|
|
--echo [ On Master ]
|
|
connection master;
|
|
BEGIN;
|
|
DELETE FROM t1;
|
|
eval $tmp_table_stm;
|
|
INSERT INTO t1 VALUES (1);
|
|
DROP TEMPORARY TABLE tt1;
|
|
COMMIT;
|
|
|
|
--echo
|
|
--echo [ On Slave ]
|
|
connection slave;
|
|
|
|
# To check if slave SQL thread is applying INSERT statement
|
|
let $show_statement= SHOW PROCESSLIST;
|
|
let $field= Info;
|
|
let $condition= LIKE 'INSERT%';
|
|
source include/wait_show_condition.inc;
|
|
|
|
send STOP SLAVE SQL_THREAD;
|
|
|
|
--echo
|
|
--echo [ On Slave1 ]
|
|
connection slave1;
|
|
--echo # To resume slave SQL thread
|
|
SET DEBUG_SYNC= 'now SIGNAL signal.continue';
|
|
SET DEBUG_SYNC= 'RESET';
|
|
|
|
--echo
|
|
--echo [ On Slave ]
|
|
connection slave;
|
|
reap;
|
|
source include/wait_for_slave_sql_to_stop.inc;
|
|
|
|
--echo # Slave should stop after the transaction has committed.
|
|
--echo # So t1 on master is same to t1 on slave.
|
|
let diff_table_1=master:test.t1;
|
|
let diff_table_2=slave:test.t1;
|
|
source include/diff_tables.inc;
|
|
|
|
connection slave;
|
|
START SLAVE SQL_THREAD;
|
|
source include/wait_for_slave_sql_to_start.inc;
|