#At file:///home/andrei/MySQL/BZR/mysql-5.1-5.1.29-rc/
2677 Andrei Elkin 2008-09-02
Bug #36099 replicate-do-db affects replaying RBR events with mysqlbinlog
The bug is about to refuse execution of a BINLOG pseudo-query on the server.
The reason of the bug appeared to be an inappropiate applying the replication slave
side
filtering rules.
The rules are supposed to be active only at times when the slave's sql thread
executes an
event.
Fixed with correcting a condition to call replication rules only if the slave sql
thread
executes the event.
added:
mysql-test/suite/binlog/r/binlog_row_bug36099.result
mysql-test/suite/binlog/t/binlog_row_bug36099-master.opt
mysql-test/suite/binlog/t/binlog_row_bug36099.test
modified:
sql/log_event.cc
per-file messages:
mysql-test/suite/binlog/r/binlog_row_bug36099.result
new result file
mysql-test/suite/binlog/t/binlog_row_bug36099-master.opt
a filtering option that would refuse to replicate a row event of the main test on
slave
mysql-test/suite/binlog/t/binlog_row_bug36099.test
a regression test for the bug
sql/log_event.cc
avoiding to call the filtering rules if the execution thread is not a slave.
=== added file 'mysql-test/suite/binlog/r/binlog_row_bug36099.result'
--- a/mysql-test/suite/binlog/r/binlog_row_bug36099.result 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/binlog/r/binlog_row_bug36099.result 2008-09-02 15:48:28 +0000
@@ -0,0 +1,14 @@
+drop table if exists t1;
+Warnings:
+Note 1051 Unknown table 't1'
+reset master;
+create table t1 (a int);
+set @@session.binlog_format=row;
+insert into t1 values (1);
+flush logs;
+drop table t1;
+must be 1
+select * from t1;
+a
+1
+drop table t1;
=== added file 'mysql-test/suite/binlog/t/binlog_row_bug36099-master.opt'
--- a/mysql-test/suite/binlog/t/binlog_row_bug36099-master.opt 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/binlog/t/binlog_row_bug36099-master.opt 2008-09-02 15:48:28 +0000
@@ -0,0 +1 @@
+--replicate-do-db='impossible_database'
=== added file 'mysql-test/suite/binlog/t/binlog_row_bug36099.test'
--- a/mysql-test/suite/binlog/t/binlog_row_bug36099.test 1970-01-01 00:00:00 +0000
+++ b/mysql-test/suite/binlog/t/binlog_row_bug36099.test 2008-09-02 15:48:28 +0000
@@ -0,0 +1,28 @@
+# regression test for
+# Bug#36099 replicate-do-db affects replaying RBR events with mysqlbinlog
+# The test verifies that the slave side filtering rule does not affect
+# applying of row-events on master via mysqlbinlog
+
+-- source include/have_log_bin.inc
+-- source include/not_embedded.inc
+
+drop table if exists t1;
+reset master;
+
+create table t1 (a int);
+set @@session.binlog_format=row;
+insert into t1 values (1);
+
+flush logs;
+--exec $MYSQL_BINLOG $MYSQLTEST_VARDIR/log/master-bin.000001 >
$MYSQLTEST_VARDIR/tmp/bug36099.sql
+
+drop table t1;
+--exec $MYSQL -e "source $MYSQLTEST_VARDIR/tmp/bug36099.sql"
+
+--echo must be 1
+select * from t1;
+
+# cleanup
+
+drop table t1;
+remove_file $MYSQLTEST_VARDIR/tmp/bug36099.sql;
=== modified file 'sql/log_event.cc'
--- a/sql/log_event.cc 2008-08-27 18:52:44 +0000
+++ b/sql/log_event.cc 2008-09-02 15:48:28 +0000
@@ -7843,8 +7843,9 @@ int Table_map_log_event::do_apply_event(
int error= 0;
- if (!rpl_filter->db_ok(table_list->db) ||
- (rpl_filter->is_on() && !rpl_filter->tables_ok("", table_list)))
+ if (rli->sql_thd->slave_thread /* filtering is for slave only */ &&
+ (!rpl_filter->db_ok(table_list->db) ||
+ (rpl_filter->is_on() && !rpl_filter->tables_ok("", table_list))))
{
my_free(memory, MYF(MY_WME));
}