summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <aelkin@mysql.com>2006-04-07 20:44:37 +0300
committerunknown <aelkin@mysql.com>2006-04-07 20:44:37 +0300
commit3ab267bf815637f5e2aaee46b48e82db9ba2c1e2 (patch)
tree2a8a6667fc42b6fc7579edc879e7cdfb77405432
parent0a2cd4bb9f14c0e49b536063e304d9c9934f48a9 (diff)
downloadmariadb-git-3ab267bf815637f5e2aaee46b48e82db9ba2c1e2.tar.gz
Bug#17284 erroneous temp table cleanup on slave.
Idea of the fix is for master to send FD event with `created' as 0 to reconnecting slave (upon slave_net_timeout, no master crash) to avoid destroying temp tables. In a case of a connect by slave to the master after its crash temp tables have been already cleaned up so that slave can not keep `orphan' temp tables. mysql-test/r/rpl_temporary.result: results mysql-test/t/rpl_temporary.test: wait-free addon to check temp tables are ok after slave reconnect. sql/sql_repl.cc: Storing zero for assigning to `created' of FD event on the reconnecting slave. mysql-test/include/get_binlog_dump_thread_id.inc: mysqltest's preudo-macro to calculate $id master dump thread id
-rw-r--r--mysql-test/include/get_binlog_dump_thread_id.inc9
-rw-r--r--mysql-test/r/rpl_temporary.result14
-rw-r--r--mysql-test/t/rpl_temporary.test27
-rw-r--r--sql/sql_repl.cc6
4 files changed, 55 insertions, 1 deletions
diff --git a/mysql-test/include/get_binlog_dump_thread_id.inc b/mysql-test/include/get_binlog_dump_thread_id.inc
new file mode 100644
index 00000000000..9efa12c5611
--- /dev/null
+++ b/mysql-test/include/get_binlog_dump_thread_id.inc
@@ -0,0 +1,9 @@
+--exec $MYSQL test -e 'show processlist' | grep 'Binlog Dump' | cut -f1 > $MYSQLTEST_VARDIR/tmp/bl_dump_thread_id
+--disable_warnings
+drop table if exists t999;
+--enable_warnings
+create temporary table t999 (f int);
+--replace_result $MYSQL_TEST_DIR "."
+eval LOAD DATA INFILE "$MYSQLTEST_VARDIR/tmp/bl_dump_thread_id" into table t999;
+let $id = `select f from t999`;
+drop table t999;
diff --git a/mysql-test/r/rpl_temporary.result b/mysql-test/r/rpl_temporary.result
index a76fb87a52b..32cd1f16b99 100644
--- a/mysql-test/r/rpl_temporary.result
+++ b/mysql-test/r/rpl_temporary.result
@@ -89,3 +89,17 @@ f
7
drop table t1,t2;
create temporary table t3 (f int);
+create temporary table t4 (f int);
+create table t5 (f int);
+drop table if exists t999;
+create temporary table t999 (f int);
+LOAD DATA INFILE "./var/tmp/bl_dump_thread_id" into table t999;
+drop table t999;
+insert into t4 values (1);
+kill `select id from information_schema.processlist where command='Binlog Dump'`;
+insert into t5 select * from t4;
+select * from t5 /* must be 1 after reconnection */;
+f
+1
+drop temporary table t4;
+drop table t5;
diff --git a/mysql-test/t/rpl_temporary.test b/mysql-test/t/rpl_temporary.test
index fcb2391a9d8..2400eac76ba 100644
--- a/mysql-test/t/rpl_temporary.test
+++ b/mysql-test/t/rpl_temporary.test
@@ -129,6 +129,31 @@ drop table t1,t2;
create temporary table t3 (f int);
sync_with_master;
+#
+# Bug#17284 erroneous temp table cleanup on slave
+#
+
+connection master;
+create temporary table t4 (f int);
+create table t5 (f int);
+sync_with_master;
+# find dumper's $id
+source include/get_binlog_dump_thread_id.inc;
+insert into t4 values (1);
+# a hint how to do that in 5.1
+--replace_result $id "`select id from information_schema.processlist where command='Binlog Dump'`"
+eval kill $id; # to stimulate reconnection by slave w/o timeout
+insert into t5 select * from t4;
+save_master_pos;
+
+connection slave;
+sync_with_master;
+select * from t5 /* must be 1 after reconnection */;
+
+connection master;
+drop temporary table t4;
+drop table t5;
+
# The server will now close done
-# End of 4.1 tests
+# End of 5.0 tests
diff --git a/sql/sql_repl.cc b/sql/sql_repl.cc
index 07678d97800..85d93767486 100644
--- a/sql/sql_repl.cc
+++ b/sql/sql_repl.cc
@@ -466,6 +466,12 @@ impossible position";
(rli->group_master_log_pos)
*/
int4store((char*) packet->ptr()+LOG_POS_OFFSET+1, 0);
+ /*
+ if reconnect master sends FD event with `created' as 0
+ to avoid destroying temp tables.
+ */
+ int4store((char*) packet->ptr()+LOG_EVENT_MINIMAL_HEADER_LEN+
+ ST_CREATED_OFFSET+1, (ulong) 0);
/* send it */
if (my_net_write(net, (char*)packet->ptr(), packet->length()))
{