From: Date: July 3 2009 3:14pm Subject: bzr commit into mysql-5.1-bugteam branch (alfranio.correia:2988) Bug#44581 List-Archive: http://lists.mysql.com/commits/77909 X-Bug: 44581 Message-Id: <0KM700GEAJFNW1C0@fe-emea-10.sun.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_S7RRucY3XycCo+M2Lo5oPg)" --Boundary_(ID_S7RRucY3XycCo+M2Lo5oPg) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///home/acorreia/workspace.sun/repository.mysql/bzrwork/bug-44581/mysql-5.1-bugteam/ based on revid:staale.smedseng@stripped 2988 Alfranio Correia 2009-07-03 BUG#44581 Slave stops when transaction with non-transactional table gets lock wait timeout In STMT and MIXED modes, a statement that changes both non-transactional and transactional tables must be written to the binary log whenever there are changes to non-transactional tables. This means that the statement gets into the binary log even when the changes to the transactional tables fail. In particular , in the presence of a failure such statement is annotated with the error number and wrapped in a begin/rollback. On the slave, while applying the statement, it is expected the same failure and the rollback prevents the transactional changes to be persisted. Unfortunately, statements that fail due to concurrency issues (e.g. deadlocks, timeouts) are logged in the same way causing the slave to stop as the statements are applied sequentially by the SQL Thread. To fix this bug, we automatically ignore concurrency failures on the slave. Specifically, the following failures are ignored: ER_LOCK_WAIT_TIMEOUT, ER_LOCK_DEADLOCK and ER_XA_RBDEADLOCK. @ sql/slave.cc Moved the validation to the log_event.cc as any other error checking is done there. @ sql/slave.h Moved the validation to the log_event.cc as any other error checking is done there. added: mysql-test/suite/rpl/r/rpl_concurrency_error.result mysql-test/suite/rpl/t/rpl_concurrency_error-master.opt mysql-test/suite/rpl/t/rpl_concurrency_error.test modified: sql/log_event.cc sql/slave.cc sql/slave.h === added file 'mysql-test/suite/rpl/r/rpl_concurrency_error.result' --- a/mysql-test/suite/rpl/r/rpl_concurrency_error.result 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/r/rpl_concurrency_error.result 2009-07-03 13:14:04 +0000 @@ -0,0 +1,119 @@ +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; +######################################################################## +# Environment +######################################################################## +CREATE TABLE t (i INT, PRIMARY KEY(i), f CHAR(8)) engine = Innodb; +CREATE TABLE n (d DATETIME, f CHAR(32)) engine = MyIsam; +CREATE TRIGGER tr AFTER UPDATE ON t FOR EACH ROW +BEGIN +INSERT INTO n VALUES ( now(), concat( 'updated t: ', old.f, ' -> ', new.f ) ); +END | +INSERT INTO t VALUES (4,'black'), (2,'red'), (3,'yelow'), (1,'cyan'); +######################################################################## +# Testing ER_LOCK_WAIT_TIMEOUT +######################################################################## +SET AUTOCOMMIT = 1; +BEGIN; +UPDATE t SET f = 'yellow 2' WHERE i = 3; +SET AUTOCOMMIT = 1; +BEGIN; +UPDATE t SET f = 'magenta 2' WHERE f = 'red'; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +INSERT INTO t VALUES (5 + (2 * 10),"brown"); +INSERT INTO n VALUES (now(),"brown"); +COMMIT; +ROLLBACK; +Warnings: +Warning 1196 Some non-transactional changed tables couldn't be rolled back +show binlog events from ; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'magenta 2' WHERE f = 'red' +master-bin.000001 # Query # # ROLLBACK +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'yellow 2' WHERE i = 3 +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO t VALUES (5 + (2 * 10),"brown") +master-bin.000001 # Query # # use `test`; INSERT INTO n VALUES (now(),"brown") +master-bin.000001 # Query # # ROLLBACK +SET AUTOCOMMIT = 1; +BEGIN; +UPDATE t SET f = 'gray 2' WHERE i = 3; +SET AUTOCOMMIT = 1; +BEGIN; +UPDATE t SET f = 'dark blue 2' WHERE f = 'red'; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +INSERT INTO t VALUES (6 + (2 * 10),"brown"); +INSERT INTO n VALUES (now(),"brown"); +COMMIT; +COMMIT; +show binlog events from ; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'dark blue 2' WHERE f = 'red' +master-bin.000001 # Query # # ROLLBACK +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'gray 2' WHERE i = 3 +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO t VALUES (6 + (2 * 10),"brown") +master-bin.000001 # Query # # use `test`; INSERT INTO n VALUES (now(),"brown") +master-bin.000001 # Xid # # COMMIT /* XID */ +SET AUTOCOMMIT = 0; +UPDATE t SET f = 'yellow 1' WHERE i = 3; +SET AUTOCOMMIT = 0; +UPDATE t SET f = 'magenta 1' WHERE f = 'red'; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +INSERT INTO t VALUES (5 + (1 * 10),"brown"); +INSERT INTO n VALUES (now(),"brown"); +COMMIT; +ROLLBACK; +Warnings: +Warning 1196 Some non-transactional changed tables couldn't be rolled back +show binlog events from ; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'magenta 1' WHERE f = 'red' +master-bin.000001 # Query # # ROLLBACK +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'yellow 1' WHERE i = 3 +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO t VALUES (5 + (1 * 10),"brown") +master-bin.000001 # Query # # use `test`; INSERT INTO n VALUES (now(),"brown") +master-bin.000001 # Query # # ROLLBACK +SET AUTOCOMMIT = 0; +UPDATE t SET f = 'gray 1' WHERE i = 3; +SET AUTOCOMMIT = 0; +UPDATE t SET f = 'dark blue 1' WHERE f = 'red'; +ERROR HY000: Lock wait timeout exceeded; try restarting transaction +INSERT INTO t VALUES (6 + (1 * 10),"brown"); +INSERT INTO n VALUES (now(),"brown"); +COMMIT; +COMMIT; +show binlog events from ; +Log_name Pos Event_type Server_id End_log_pos Info +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'dark blue 1' WHERE f = 'red' +master-bin.000001 # Query # # ROLLBACK +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; UPDATE t SET f = 'gray 1' WHERE i = 3 +master-bin.000001 # Xid # # COMMIT /* XID */ +master-bin.000001 # Query # # BEGIN +master-bin.000001 # Query # # use `test`; INSERT INTO t VALUES (6 + (1 * 10),"brown") +master-bin.000001 # Query # # use `test`; INSERT INTO n VALUES (now(),"brown") +master-bin.000001 # Xid # # COMMIT /* XID */ +source include/diff_master_slave.inc; +source include/diff_master_slave.inc; +######################################################################## +# Cleanup +######################################################################## +DROP TRIGGER tr; +DROP TABLE t; +DROP TABLE n; === added file 'mysql-test/suite/rpl/t/rpl_concurrency_error-master.opt' --- a/mysql-test/suite/rpl/t/rpl_concurrency_error-master.opt 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_concurrency_error-master.opt 2009-07-03 13:14:04 +0000 @@ -0,0 +1 @@ +--innodb-lock-wait-timeout=1 === added file 'mysql-test/suite/rpl/t/rpl_concurrency_error.test' --- a/mysql-test/suite/rpl/t/rpl_concurrency_error.test 1970-01-01 00:00:00 +0000 +++ b/mysql-test/suite/rpl/t/rpl_concurrency_error.test 2009-07-03 13:14:04 +0000 @@ -0,0 +1,149 @@ +############################################################################### +#BUG#44581 Slave stops when transaction with non-transactional table gets +#lock wait timeout +# +# In STMT and MIXED modes, a statement that changes both non-transactional and +# transactional tables must be written to the binary log whenever there are +# changes to non-transactional tables. This means that the statement gets into +# the # binary log even when the changes to the transactional tables fail. In +# particular, in the presence of a failure such statement is annotated with the +# error number and wrapped in a begin/rollback. On the slave, while applying +# the statement, it is expected the same failure and the rollback prevents the +# transactional changes to be persisted. + +# This test aims to verify if a statement that updates both transactional and +# non-transacitonal tables and fails due to concurrency problems is correctly +# processed by the slave in the sense that the statements get into the binary +# log, the error is ignored and only the non-transactional tables are changed. +############################################################################### + +--source include/master-slave.inc +--source include/have_innodb.inc +--source include/have_binlog_format_statement.inc + +--echo ######################################################################## +--echo # Environment +--echo ######################################################################## +connection master; + +CREATE TABLE t (i INT, PRIMARY KEY(i), f CHAR(8)) engine = Innodb; +CREATE TABLE n (d DATETIME, f CHAR(32)) engine = MyIsam; + +DELIMITER |; +CREATE TRIGGER tr AFTER UPDATE ON t FOR EACH ROW +BEGIN + INSERT INTO n VALUES ( now(), concat( 'updated t: ', old.f, ' -> ', new.f ) ); +END | +DELIMITER ;| + +INSERT INTO t VALUES (4,'black'), (2,'red'), (3,'yelow'), (1,'cyan'); + +connect (conn1, 127.0.0.1,root,,); +connect (conn2, 127.0.0.1,root,,); + +--echo ######################################################################## +--echo # Testing ER_LOCK_WAIT_TIMEOUT +--echo ######################################################################## + +let $type=2; + +while ($type) +{ + let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1); + connection conn1; + if (`select $type = 2`) + { + SET AUTOCOMMIT = 1; + BEGIN; + } + if (`select $type = 1`) + { + SET AUTOCOMMIT = 0; + } + eval UPDATE t SET f = 'yellow $type' WHERE i = 3; + + connection conn2; + if (`select $type = 2`) + { + SET AUTOCOMMIT = 1; + BEGIN; + } + if (`select $type = 1`) + { + SET AUTOCOMMIT = 0; + } + --error ER_LOCK_WAIT_TIMEOUT + eval UPDATE t SET f = 'magenta $type' WHERE f = 'red'; + eval INSERT INTO t VALUES (5 + ($type * 10),"brown"); + INSERT INTO n VALUES (now(),"brown"); + + connection conn1; + COMMIT; + + connection conn2; + ROLLBACK; + --source include/show_binlog_events.inc + + let $binlog_start= query_get_value("SHOW MASTER STATUS", Position, 1); + connection conn1; + if (`select $type = 2`) + { + SET AUTOCOMMIT = 1; + BEGIN; + } + if (`select $type = 1`) + { + SET AUTOCOMMIT = 0; + } + eval UPDATE t SET f = 'gray $type' WHERE i = 3; + + connection conn2; + if (`select $type = 2`) + { + SET AUTOCOMMIT = 1; + BEGIN; + } + if (`select $type = 1`) + { + SET AUTOCOMMIT = 0; + } + --error ER_LOCK_WAIT_TIMEOUT + eval UPDATE t SET f = 'dark blue $type' WHERE f = 'red'; + eval INSERT INTO t VALUES (6 + ($type * 10),"brown"); + INSERT INTO n VALUES (now(),"brown"); + + connection conn1; + COMMIT; + + connection conn2; + COMMIT; + --source include/show_binlog_events.inc + + dec $type; +} + +connection master; +sync_slave_with_master; + +connection master; +let $diff_statement= SELECT * FROM t order by i; +source include/diff_master_slave.inc; + +connection master; +let $diff_statement= SELECT * FROM n order by d, f; +source include/diff_master_slave.inc; + +--echo ######################################################################## +--echo # Cleanup +--echo ######################################################################## + +connection master; +DROP TRIGGER tr; +DROP TABLE t; +DROP TABLE n; + +sync_slave_with_master; + +connection master; +disconnect conn1; +disconnect conn2; === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2009-06-29 14:00:47 +0000 +++ b/sql/log_event.cc 2009-07-03 13:14:04 +0000 @@ -333,6 +333,9 @@ inline int ignored_error_code(int err_co { case ER_DB_CREATE_EXISTS: case ER_DB_DROP_EXISTS: + case ER_LOCK_WAIT_TIMEOUT: + case ER_LOCK_DEADLOCK: + case ER_XA_RBDEADLOCK: return 1; default: /* Nothing to do */ @@ -369,6 +372,21 @@ int convert_handler_error(int error, THD return (actual_error); } +inline bool check_expected_error(int expected_error) +{ + switch (expected_error) + { + case ER_NET_READ_ERROR: + case ER_NET_ERROR_ON_WRITE: + case ER_QUERY_INTERRUPTED: + case ER_SERVER_SHUTDOWN: + case ER_NEW_ABORTING_CONNECTION: + return(TRUE); + default: + return(FALSE); + } +} + /* pretty_print_str() */ @@ -3006,7 +3024,7 @@ int Query_log_event::do_apply_event(Rela DBUG_PRINT("query",("%s",thd->query)); if (ignored_error_code((expected_error= error_code)) || - !check_expected_error(thd,rli,expected_error)) + !check_expected_error(expected_error)) { if (flags2_inited) /* === modified file 'sql/slave.cc' --- a/sql/slave.cc 2009-06-29 14:00:47 +0000 +++ b/sql/slave.cc 2009-07-03 13:14:04 +0000 @@ -1884,25 +1884,6 @@ static ulong read_event(MYSQL* mysql, Ma DBUG_RETURN(len - 1); } - -int check_expected_error(THD* thd, Relay_log_info const *rli, - int expected_error) -{ - DBUG_ENTER("check_expected_error"); - - switch (expected_error) { - case ER_NET_READ_ERROR: - case ER_NET_ERROR_ON_WRITE: - case ER_QUERY_INTERRUPTED: - case ER_SERVER_SHUTDOWN: - case ER_NEW_ABORTING_CONNECTION: - DBUG_RETURN(1); - default: - DBUG_RETURN(0); - } -} - - /* Check if the current error is of temporary nature of not. Some errors are temporary in nature, such as === modified file 'sql/slave.h' --- a/sql/slave.h 2009-06-23 09:10:04 +0000 +++ b/sql/slave.h 2009-07-03 13:14:04 +0000 @@ -171,7 +171,6 @@ bool rpl_master_has_bug(const Relay_log_ bool rpl_master_erroneous_autoinc(THD* thd); const char *print_slave_db_safe(const char *db); -int check_expected_error(THD* thd, Relay_log_info const *rli, int error_code); void skip_load_data_infile(NET* net); void end_slave(); /* release slave threads */ --Boundary_(ID_S7RRucY3XycCo+M2Lo5oPg) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name*0="bzr/alfranio.correia@stripped"; name*1=404-dmdd3atrezhs2ll6.bundle Content-transfer-encoding: 7BIT Content-disposition: inline; filename*0="bzr/alfranio.correia@stripped"; filename*1=404-dmdd3atrezhs2ll6.bundle # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alfranio.correia@stripped\ # dmdd3atrezhs2ll6 # target_branch: file:///home/acorreia/workspace.sun/repository.mysql\ # /bzrwork/bug-44581/mysql-5.1-bugteam/ # testament_sha1: 3794b1d3336be01082d2da7f7f1597e91627c581 # timestamp: 2009-07-03 14:14:10 +0100 # base_revision_id: staale.smedseng@stripped\ # zfymbun9f5wm2ru6 # # Begin bundle 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 aVI1xiEIK/q2ap9/KqMKwwvcW5oc91mGCqn7VlzacTB2bMC4zd78N/Fwm0yP6Gbgbt1VVVXBjnt3 rPLWp5fu58MMc38A7jmej3/vZdVrykdNSxBie7HmqVVXLNl3aK4ibGQmhpFUdf7EenyQSnKbs7ys JVUKuzwQw7B+nue+FRzv6J/z/kT8T+Z9DJKSNGYfo39pzCpVfjD6n/clz7yj/EP9fHdc2FJ+RUoZ pQXTJONJjP7r9RP+kvfFX5pGDPtVqbDpslrDgRzJYin6fnyX6ORlJqzbuTLakaM2TRMI/MrtIvN6 7KE3bondSwlxC9tn1OR/8Uf6ZnS1Nx1nWkaf5TxI3TUcU5JwHJrSLYdNJSUqqpVVTpoS7jJJlTgl L2Nc5T2u5viXKH6bYdw6Dvh5DgN0JqNpg4rlDfJJSy6STmfguXpL5xsNbr1y7CpCVmJuJQdMjmkk 0Y2yvT0qjmrWlO9z6mxO1IsrrLO3Xcg1YpUOoteuIram88zozTTi5m5OCXtckmzS+7aol9RJvdGT pE4ec2lFF5HpX2mim8pStRzuKRsDcJyWIw2qwhkOpdoSX9VXulbLBm2pr2ZsRNA1nfqamif4YQyb 9IC3Ew0tsbbG2xt1bDYLdzAFVAFTA50uItbbgWbWCcUyYtRbt7/F5N39sYm9dZSYJxufxez+cPlH pnvk/4VZ9Zi+Kp8kotSMj8H7zMaY/VhlM2lI0P3NSXaKmikyfqP/BcHqHlC3/ai0n8W5J/Fztj/R +Ta/bNr6vs4P5OEHCNXS4LknX/J/CnFS5I38ylzN/Rtbsjag96LRGPQlYvkLoQF/vR+X7jEBiobM G4LzRoWlDq8XPwkfT4EuQuZrSRSyypy4VZjVVzB5o+BrkuUbIwm8daJNsllpmxY1JLZL7P5hyy1b ITRTdHL7NTr7bNHQs7Xg/FvmCmLFubTxYvDxeLtZJg6VLlzqeh6BFzyUn2T/L/2fk1H9qRjHfusU 7Yjru0TZujlLzkbGs+CFoJtJmI1MO0olB8BayhI2kFQsDN7GwXq8r8UeeF7g/Phrf2O2z14Mtmwd NOP+bToR5E1plZalxbOF/CSMU7J9Foqo1vesLJWEFOrSQ1lJKQromjWTzLItNapgVRVRSkpRM/oS 0z9SzsbfMwaNoZs+9rTBQ0v1C71r5MAqLi5ujzzB0vM51m1Z7poy84YP/Tuhk9DiszLeLq2PQ6n0 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 OTBsfIA= --Boundary_(ID_S7RRucY3XycCo+M2Lo5oPg)--