From: Luis Soares Date: September 20 2010 3:39pm Subject: bzr commit into mysql-5.1-bugteam branch (luis.soares:3514) List-Archive: http://lists.mysql.com/commits/118617 Message-Id: <201009201540.o8KE8b93025154@acsinet15.oracle.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1943347693962048842==" --===============1943347693962048842== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/lsoares/Workspace/bzr/work/bugfixing/46110/mysql-5.1-bugteam/ based on revid:alfranio.correia@stripped 3514 Luis Soares 2010-09-20 B46110: Work-in-Progress When using --replicate-do-db and --replicate-ignore-db with --replicate-wild-do-table, some database level statements, eg DROP DATABASE or CREATE DATABASE, might not be replayed even if the DATABASE name was inline with the rules set in --replicate-do-db and/or --replicate-ignore-db. The following example would not replicate correctly: SLAVE, configured with: --replicate-do-db=dbx --replicate-wild-do-table=db%.t1 MASTER, dba issues: MASTER> CREATE DATABASE dbx; Although, at first sight, there is nothing in the filter rules that might prevent this statement to be replayed, the slave would not execute it. In fact, "replicate-wild-do-table=db%.t1" invalidates the "OK" from "replicate-do-db=dbx", making the event to be skipped/filtered out. We fix this, by making --replicate-do/ignore-db rules take precedence over replicate-wild-do-table for *database* level statements only: - CREATE/DROP/ALTER DATABASE ... As such, when replicating such statements, we only look into replicate-wild-do-table if and only if replicate-do/ignore-db rules are void. Otherwise, --replicate-do/ignore-db rules dictate the fate of the statement: either filtered out or executed. added: mysql-test/suite/rpl/r/rpl_filter_bug.result mysql-test/suite/rpl/t/rpl_filter_bug-slave.opt mysql-test/suite/rpl/t/rpl_filter_bug.test modified: sql/sql_parse.cc === added file 'mysql-test/suite/rpl/r/rpl_filter_bug.result' --- a/mysql-test/suite/rpl/r/rpl_filter_bug.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_filter_bug.result 2010-09-20 15:39:49 +0000 @@ -0,0 +1,6 @@ +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; === added file 'mysql-test/suite/rpl/t/rpl_filter_bug-slave.opt' --- a/mysql-test/suite/rpl/t/rpl_filter_bug-slave.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_filter_bug-slave.opt 2010-09-20 15:39:49 +0000 @@ -0,0 +1 @@ +--replicate-do-db=dbx --replicate-wild-do-table=db%.t1 === added file 'mysql-test/suite/rpl/t/rpl_filter_bug.test' --- a/mysql-test/suite/rpl/t/rpl_filter_bug.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_filter_bug.test 2010-09-20 15:39:49 +0000 @@ -0,0 +1,76 @@ +# +# BUG#46110: --replicate-wild-do-table invalidates --replicate-do-db matching rule +# + +-- source include/master-slave.inc + +## Checking CREATE DATABASE + +-- disable_query_log +CREATE DATABASE dbx DEFAULT CHARACTER SET=latin1; +-- enable_query_log + +if (!`SELECT count(*) = 1 FROM information_schema.SCHEMATA WHERE schema_name = 'dbx'`) +{ + -- echo unexpected default character set for database: dbx + -- source include/show_rpl_debug_info.inc + -- die +} + +-- sync_slave_with_master + +if (!`SELECT count(*) = 1 FROM information_schema.SCHEMATA WHERE schema_name = 'dbx'`) +{ + -- echo unexpected default character set for database: dbx + -- source include/show_rpl_debug_info.inc + -- die +} + +## Checking ALTER DATABASE + +-- connection master + +-- disable_query_log +ALTER DATABASE dbx DEFAULT CHARACTER SET=latin5; +-- enable_query_log + +if (!`SELECT DEFAULT_CHARACTER_SET_NAME='latin5' FROM information_schema.SCHEMATA WHERE schema_name = 'dbx'`) +{ + -- echo unexpected default character set for database: dbx + -- source include/show_rpl_debug_info.inc + -- die +} + +-- sync_slave_with_master + +if (!`SELECT DEFAULT_CHARACTER_SET_NAME='latin5' FROM information_schema.SCHEMATA WHERE schema_name = 'dbx'`) +{ + -- echo unexpected default character set for database: dbx + -- source include/show_rpl_debug_info.inc + -- die +} + +## Checking DROP DATABASE + +-- connection master +-- disable_query_log +DROP DATABASE dbx; +-- enable_query_log + +if (!`SELECT count(*) = 0 FROM information_schema.SCHEMATA WHERE schema_name = 'dbx'`) +{ + -- echo unexpected default character set for database: dbx + -- source include/show_rpl_debug_info.inc + -- die +} + +-- sync_slave_with_master + +if (!`SELECT count(*) = 0 FROM information_schema.SCHEMATA WHERE schema_name = 'dbx'`) +{ + -- echo unexpected default character set for database: dbx + -- source include/show_rpl_debug_info.inc + -- die +} + +-- source include/master-slave-end.inc === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2010-08-18 04:56:06 +0000 +++ b/sql/sql_parse.cc 2010-09-20 15:39:49 +0000 @@ -217,6 +217,34 @@ inline bool all_tables_not_ok(THD *thd, return rpl_filter->is_on() && tables && !thd->spcont && !rpl_filter->tables_ok(thd->db, tables); } + +inline bool db_stmt_db_ok(THD *thd, char* db) +{ + DBUG_ENTER("db_stmt_db_ok"); + + if (!thd->slave_thread) + DBUG_RETURN(TRUE); + + /* + + Checking whether the event for the given database, db, should + be ignored or not, is done by checking whether there are + active rules in ignore_db or in do_db containers. If there + are, then check if there is a match, if not then check the + wild_do rules. + + This means that when using this function replicate-do-db and + replicate-ignore-db take precedence over wild do rules. + + */ + + bool filtered= (!(rpl_filter->get_do_db()->is_empty() && + rpl_filter->get_ignore_db()->is_empty())) ? /* filters exist in ignore/do_db ? */ + !rpl_filter->db_ok(db) : /* then just check them */ + !rpl_filter->db_ok_with_wild_table(db); /* if not, then check wild do table */ + + DBUG_RETURN(!filtered); +} #endif @@ -3646,9 +3674,7 @@ end_with_restore_list: above was not called. So we have to check rules again here. */ #ifdef HAVE_REPLICATION - if (thd->slave_thread && - (!rpl_filter->db_ok(lex->name.str) || - !rpl_filter->db_ok_with_wild_table(lex->name.str))) + if (!db_stmt_db_ok(thd, lex->name.str)) { my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0)); break; @@ -3681,9 +3707,7 @@ end_with_restore_list: above was not called. So we have to check rules again here. */ #ifdef HAVE_REPLICATION - if (thd->slave_thread && - (!rpl_filter->db_ok(lex->name.str) || - !rpl_filter->db_ok_with_wild_table(lex->name.str))) + if (!db_stmt_db_ok(thd, lex->name.str)) { my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0)); break; @@ -3710,9 +3734,7 @@ end_with_restore_list: break; } #ifdef HAVE_REPLICATION - if (thd->slave_thread && - (!rpl_filter->db_ok(db->str) || - !rpl_filter->db_ok_with_wild_table(db->str))) + if (!db_stmt_db_ok(thd, lex->name.str)) { res= 1; my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0)); @@ -3764,9 +3786,7 @@ end_with_restore_list: above was not called. So we have to check rules again here. */ #ifdef HAVE_REPLICATION - if (thd->slave_thread && - (!rpl_filter->db_ok(db->str) || - !rpl_filter->db_ok_with_wild_table(db->str))) + if (!db_stmt_db_ok(thd, lex->name.str)) { my_message(ER_SLAVE_IGNORED_TABLE, ER(ER_SLAVE_IGNORED_TABLE), MYF(0)); break; --===============1943347693962048842== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/luis.soares@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: luis.soares@stripped # target_branch: file:///home/lsoares/Workspace/bzr/work/bugfixing\ # /46110/mysql-5.1-bugteam/ # testament_sha1: 718854189336d6f594f4324463c128f6e6f335ff # timestamp: 2010-09-20 16:40:01 +0100 # source_branch: /home/lsoares/Workspace/bzr/clones/mysql-5.1-bugteam # base_revision_id: alfranio.correia@stripped\ # tmt4mfkrps3hs8ne # # Begin bundle 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 --===============1943347693962048842==--