From: Luis Soares Date: November 1 2009 11:37pm Subject: bzr push into mysql-pe branch (luis.soares:3660 to 3661) Bug#42829 List-Archive: http://lists.mysql.com/commits/88878 X-Bug: 42829 Message-Id: <0KSG00A9EEWKT100@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_NmMWjQIwIv8UraIe/lGI3Q)" --Boundary_(ID_NmMWjQIwIv8UraIe/lGI3Q) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline 3661 Luis Soares 2009-11-01 [merge] BUG#42829: manual merge mysql-5.1-bugteam --> mysql-pe Conflicts ========= Conflict adding files to storage/innodb_plugin. Created directory. Conflict because storage/innodb_plugin is not versioned, but has versioned children. Versioned directory. Conflict adding files to storage/innodb_plugin/handler. Created directory. Conflict because storage/innodb_plugin/handler is not versioned, but has versioned children. Versioned directory. Contents conflict in storage/innodb_plugin/handler/ha_innodb.cc Contents conflict in storage/innodb_plugin/handler/ha_innodb.h 6 conflicts encountered. added: mysql-test/suite/binlog/r/binlog_stm_do_db.result mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt mysql-test/suite/binlog/t/binlog_stm_do_db.test modified: sql/sql_base.cc sql/sql_class.cc storage/innobase/handler/ha_innodb.cc storage/innobase/handler/ha_innodb.h 3660 Sergey Vojtovich 2009-11-01 [merge] Merge fix for BUG#43171 mysql-5.1-bugteam => mysql-pe. modified: mysql-test/r/xa.result mysql-test/t/xa.test sql/handler.cc sql/transaction.cc === added file 'mysql-test/suite/binlog/r/binlog_stm_do_db.result' --- a/mysql-test/suite/binlog/r/binlog_stm_do_db.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/r/binlog_stm_do_db.result 2009-09-24 14:52:52 +0000 @@ -0,0 +1,42 @@ +SET @old_isolation_level= @@session.tx_isolation; +SET @@session.tx_isolation= 'READ-COMMITTED'; +CREATE DATABASE b42829; +use b42829; +CREATE TABLE t1 (x int, y int) engine=InnoDB; +CREATE TABLE t2 (x int, y int) engine=InnoDB; +CREATE DATABASE b42829_filtered; +use b42829_filtered; +CREATE TABLE t1 (x int, y int) engine=InnoDB; +CREATE TABLE t2 (x int, y int) engine=InnoDB; +SET @@session.sql_log_bin= 0; +INSERT INTO b42829_filtered.t1 VALUES (100,100); +INSERT INTO b42829.t1 VALUES (100,100); +SET @@session.sql_log_bin= 1; +### assertion: the inserts will not raise log error because +### binlog-do-db is filtering used database +INSERT INTO t2 VALUES (1,2), (1,3), (1,4); +INSERT INTO t1 SELECT * FROM t2; +### assertion: assert that despite updating a not filtered +### database this wont trigger an error as the +### used database is the filtered one. +UPDATE b42829_filtered.t1 ft1, b42829.t1 nft1 SET ft1.x=1, nft1.x=2; +use b42829; +### assertion: the statements *will* raise log error because +### binlog-do-db is not filtering used database +BEGIN; +INSERT INTO t2 VALUES (1,2), (1,3), (1,4); +ERROR HY000: Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT' +UPDATE b42829_filtered.t1 ft1, b42829.t1 nft1 SET ft1.x=1, nft1.x=2; +ERROR HY000: Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT' +INSERT INTO t1 SELECT * FROM t2; +ERROR HY000: Binary logging not possible. Message: Transaction level 'READ-COMMITTED' in InnoDB is not safe for binlog mode 'STATEMENT' +COMMIT; +### assertion: filtered events did not make into the binlog +show binlog events from ; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # CREATE DATABASE b42829 +master-bin.000001 # Query # # use `b42829`; CREATE TABLE t1 (x int, y int) engine=InnoDB +master-bin.000001 # Query # # use `b42829`; CREATE TABLE t2 (x int, y int) engine=InnoDB +DROP DATABASE b42829; +DROP DATABASE b42829_filtered; +SET @@session.tx_isolation= @old_isolation_level; === added file 'mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt' --- a/mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_do_db-master.opt 2009-09-24 14:52:52 +0000 @@ -0,0 +1 @@ +--binlog-do-db=b42829 === added file 'mysql-test/suite/binlog/t/binlog_stm_do_db.test' --- a/mysql-test/suite/binlog/t/binlog_stm_do_db.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/binlog/t/binlog_stm_do_db.test 2009-09-24 14:52:52 +0000 @@ -0,0 +1,90 @@ +# BUG#42829: binlogging enabled for all schemas regardless of +# binlog-db-db / binlog-ignore-db +# +# WHAT +# ==== +# +# We want to test whether filtered events from binlog will cause +# raising an error mentioning that statement is unable to be logged or +# not, when: +# +# 1. isolation level READ-COMMITTED; AND +# +# 2. using InnoDB engine; AND +# +# 3. using SBL (in which case InnoDB will only allow RBL). +# +# HOW +# === +# +# The test is implemented as follows: +# +# i) set tx_isolation to read-committed. +# +# ii) create two databases (one filtered other not - using +# binlog-do-db) +# +# iii) Create statements that are to be filtered on filtered db +# +# - At this point, before fix, an error would be raised +# +# iv) do the same thing for not the filtered database and check +# that events throw an error: +# +# - Error: ER_BINLOG_STMT_MODE_AND_ROW_ENGINE +# + +-- source include/have_log_bin.inc +-- source include/have_innodb.inc +-- source include/have_binlog_format_statement.inc + +SET @old_isolation_level= @@session.tx_isolation; +SET @@session.tx_isolation= 'READ-COMMITTED'; + +-- let $engine= InnoDB +-- let $filtered= b42829_filtered +-- let $not_filtered= b42829 + +-- eval CREATE DATABASE $not_filtered +-- eval use $not_filtered +-- eval CREATE TABLE t1 (x int, y int) engine=$engine +-- eval CREATE TABLE t2 (x int, y int) engine=$engine + +-- eval CREATE DATABASE $filtered +-- eval use $filtered +-- eval CREATE TABLE t1 (x int, y int) engine=$engine +-- eval CREATE TABLE t2 (x int, y int) engine=$engine + +SET @@session.sql_log_bin= 0; +-- eval INSERT INTO $filtered.t1 VALUES (100,100) +-- eval INSERT INTO $not_filtered.t1 VALUES (100,100) +SET @@session.sql_log_bin= 1; + +-- echo ### assertion: the inserts will not raise log error because +-- echo ### binlog-do-db is filtering used database +INSERT INTO t2 VALUES (1,2), (1,3), (1,4); +INSERT INTO t1 SELECT * FROM t2; + +-- echo ### assertion: assert that despite updating a not filtered +-- echo ### database this wont trigger an error as the +-- echo ### used database is the filtered one. +-- eval UPDATE $filtered.t1 ft1, $not_filtered.t1 nft1 SET ft1.x=1, nft1.x=2 + +-- eval use $not_filtered +-- echo ### assertion: the statements *will* raise log error because +-- echo ### binlog-do-db is not filtering used database +BEGIN; +-- error ER_BINLOG_LOGGING_IMPOSSIBLE +INSERT INTO t2 VALUES (1,2), (1,3), (1,4); +-- error ER_BINLOG_LOGGING_IMPOSSIBLE +-- eval UPDATE $filtered.t1 ft1, $not_filtered.t1 nft1 SET ft1.x=1, nft1.x=2 +-- error ER_BINLOG_LOGGING_IMPOSSIBLE +INSERT INTO t1 SELECT * FROM t2; +COMMIT; + +-- echo ### assertion: filtered events did not make into the binlog +source include/show_binlog_events.inc; + +-- eval DROP DATABASE $not_filtered +-- eval DROP DATABASE $filtered +SET @@session.tx_isolation= @old_isolation_level; === modified file 'sql/sql_base.cc' --- a/sql/sql_base.cc 2009-10-23 06:24:37 +0000 +++ b/sql/sql_base.cc 2009-11-01 23:27:36 +0000 @@ -27,6 +27,7 @@ #include #include #include +#include "rpl_filter.h" #ifdef __WIN__ #include #endif @@ -4881,7 +4882,16 @@ static void mark_real_tables_as_free_for bool decide_logging_format(THD *thd, TABLE_LIST *tables) { - if (mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG)) + /* + In SBR mode, we are only proceeding if we are binlogging this + statement, ie, the filtering rules won't later filter this out. + + This check here is needed to prevent some spurious error to be + raised in some cases (See BUG#42829). + */ + if (mysql_bin_log.is_open() && (thd->options & OPTION_BIN_LOG) && + (thd->variables.binlog_format != BINLOG_FORMAT_STMT || + binlog_filter->db_ok(thd->db))) { /* Compute the starting vectors for the computations by creating a === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2009-10-30 15:36:45 +0000 +++ b/sql/sql_class.cc 2009-11-01 23:27:36 +0000 @@ -3217,6 +3217,11 @@ extern "C" void thd_mark_transaction_to_ { mark_transaction_to_rollback(thd, all); } + +extern "C" bool thd_binlog_filter_ok(const MYSQL_THD thd) +{ + return binlog_filter->db_ok(thd->db); +} #endif // INNODB_COMPATIBILITY_HOOKS */ /**************************************************************************** === modified file 'storage/innobase/handler/ha_innodb.cc' --- a/storage/innobase/handler/ha_innodb.cc 2009-10-30 15:36:45 +0000 +++ b/storage/innobase/handler/ha_innodb.cc 2009-11-01 23:27:36 +0000 @@ -6922,8 +6922,9 @@ ha_innobase::external_lock( { ulong const binlog_format= thd_binlog_format(thd); ulong const tx_isolation = thd_tx_isolation(current_thd); - if (tx_isolation <= ISO_READ_COMMITTED && - binlog_format == BINLOG_FORMAT_STMT) + if (tx_isolation <= ISO_READ_COMMITTED + && binlog_format == BINLOG_FORMAT_STMT + && thd_binlog_filter_ok(thd)) { char buf[256]; my_snprintf(buf, sizeof(buf), === modified file 'storage/innobase/handler/ha_innodb.h' --- a/storage/innobase/handler/ha_innodb.h 2009-09-16 13:31:23 +0000 +++ b/storage/innobase/handler/ha_innodb.h 2009-11-01 23:27:36 +0000 @@ -290,4 +290,11 @@ int thd_binlog_format(const MYSQL_THD th @param all TRUE <=> rollback main transaction. */ void thd_mark_transaction_to_rollback(MYSQL_THD thd, bool all); + +/** + Check if binary logging is filtered for thread's current db. + @param thd Thread handle + @retval 1 the query is not filtered, 0 otherwise. +*/ +bool thd_binlog_filter_ok(const MYSQL_THD thd); } --Boundary_(ID_NmMWjQIwIv8UraIe/lGI3Q) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/luis.soares@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/luis.soares@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: luis.soares@stripped # target_branch: file:///home/lsoares/Workspace/bzr/work/bugfixing\ # /42829/mysql-pe/ # testament_sha1: 06044ef5f74540a09e8eae76a5b55f1a3a0c397d # timestamp: 2009-11-01 23:37:18 +0000 # source_branch: file:///home/lsoares/Workspace/bzr/work/bugfixing\ # /42829/mysql-5.1-bugteam/ # base_revision_id: svoj@stripped # # Begin bundle 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 Q/B2LicDW+bn7OiB6v480v/xdyRThQkPHhJdsA== --Boundary_(ID_NmMWjQIwIv8UraIe/lGI3Q)--