From: Andrei Elkin Date: March 29 2011 2:56pm Subject: bzr commit into mysql-trunk branch (andrei.elkin:3344) List-Archive: http://lists.mysql.com/commits/134173 Message-Id: <201103291456.p2TEuJGJ013464@mysql1000.dsl.inet.fi> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============1462643462==" --===============1462643462== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/andrei/MySQL/BZR/2a-23May/MERGE/mysql-trunk/ based on revid:andrei.elkin@stripped 3344 Andrei Elkin 2011-03-29 [merge] merge from local bugfixing branch to local mysql-trunk prior to push modified: mysql-test/extra/rpl_tests/rpl_deadlock.test mysql-test/suite/rpl/r/rpl_deadlock_innodb.result sql/rpl_reporting.cc sql/rpl_reporting.h sql/rpl_slave.cc === modified file 'mysql-test/extra/rpl_tests/rpl_deadlock.test' --- a/mysql-test/extra/rpl_tests/rpl_deadlock.test 2010-12-19 17:07:28 +0000 +++ b/mysql-test/extra/rpl_tests/rpl_deadlock.test 2011-03-27 18:16:32 +0000 @@ -123,6 +123,57 @@ SELECT * FROM t3; source include/check_slave_is_running.inc; --echo +# +# bug#11748510/36524 incident of deadlock on slave is overdramatized +# +# Observe that the slave stopped when the number of transation retries +# exceeds @@global.slave_transaction_retries +# +connection master; + +--echo *** Test the deadlock warning to be escalated into the error *** + +delete from t1; +delete from t2; +delete from t3; + +sync_slave_with_master; + +# make sure slave's unilateral row gone as well +delete from t1; +delete from t2; +delete from t3; + +# the first attempt to run a deadlock scenario of p 1) leads to the error +set @save.slave_transaction_retries= @@global.slave_transaction_retries; +set @@global.slave_transaction_retries= 0; +source include/stop_slave.inc; + +connection master; + +BEGIN; +INSERT INTO t1 VALUES (1); +# We make a long transaction here +INSERT INTO t2 VALUES (2), (2), (2), (2), (2), (2), (2), (2), (2), (2); +INSERT INTO t3 VALUES (3); +COMMIT; + +connection slave; +BEGIN; +SELECT count(*) as zero FROM t1 FOR UPDATE; + +start slave; + +--echo *** Now the slave must be stopped due to timeout *** + +let $slave_sql_errno= 1205; # ER_LOCK_TIMEOUT +let $show_slave_sql_error= 0; +source include/wait_for_slave_sql_error.inc; + +rollback; + +set @@global.slave_transaction_retries= @save.slave_transaction_retries; +source include/start_slave.inc; # Clean up --echo *** Clean up *** connection master; === modified file 'mysql-test/suite/rpl/r/rpl_deadlock_innodb.result' --- a/mysql-test/suite/rpl/r/rpl_deadlock_innodb.result 2010-12-19 17:22:30 +0000 +++ b/mysql-test/suite/rpl/r/rpl_deadlock_innodb.result 2011-03-27 18:16:32 +0000 @@ -103,6 +103,31 @@ a 3 include/check_slave_is_running.inc +*** Test the deadlock warning to be escalated into the error *** +delete from t1; +delete from t2; +delete from t3; +delete from t1; +delete from t2; +delete from t3; +set @save.slave_transaction_retries= @@global.slave_transaction_retries; +set @@global.slave_transaction_retries= 0; +include/stop_slave.inc +BEGIN; +INSERT INTO t1 VALUES (1); +INSERT INTO t2 VALUES (2), (2), (2), (2), (2), (2), (2), (2), (2), (2); +INSERT INTO t3 VALUES (3); +COMMIT; +BEGIN; +SELECT count(*) as zero FROM t1 FOR UPDATE; +zero +0 +start slave; +*** Now the slave must be stopped due to timeout *** +include/wait_for_slave_sql_error.inc [errno=1205] +rollback; +set @@global.slave_transaction_retries= @save.slave_transaction_retries; +include/start_slave.inc *** Clean up *** DROP TABLE t1,t2,t3; SET global max_relay_log_size= @my_max_relay_log_size; === modified file 'sql/rpl_reporting.cc' --- a/sql/rpl_reporting.cc 2010-08-05 17:45:25 +0000 +++ b/sql/rpl_reporting.cc 2011-03-28 13:19:08 +0000 @@ -17,6 +17,7 @@ #include "rpl_reporting.h" #include "log.h" // sql_print_error, sql_print_warning, // sql_print_information +#include "rpl_slave.h" Slave_reporting_capability::Slave_reporting_capability(char const *thread_name) : m_thread_name(thread_name) @@ -25,15 +26,94 @@ Slave_reporting_capability::Slave_report &err_lock, MY_MUTEX_INIT_FAST); } +#if !defined(EMBEDDED_LIBRARY) +/** + Check if the current error is of temporary nature or not. + Some errors are temporary in nature, such as + ER_LOCK_DEADLOCK and ER_LOCK_WAIT_TIMEOUT. Ndb also signals + that the error is temporary by pushing a warning with the error code + ER_GET_TEMPORARY_ERRMSG, if the originating error is temporary. + + @param thd a THD instance, typically of the slave SQL thread's. + @error_arg the error code for assessment. + defaults to zero which makes the function check the top + of the reported errors stack. + + @return 1 as the positive and 0 as the negative verdict +*/ +int Slave_reporting_capability::has_temporary_error(THD *thd, uint error_arg) const +{ + uint error; + DBUG_ENTER("has_temporary_error"); + + DBUG_EXECUTE_IF("all_errors_are_temporary_errors", + if (thd->stmt_da->is_error()) + { + thd->clear_error(); + my_error(ER_LOCK_DEADLOCK, MYF(0)); + }); + + /* + The state of the slave thread can't be regarded as + experiencing a temporary failure in cases of @c is_slave_error was set TRUE, + or if there is no message in THD, we can't say if it's a temporary + error or not. This is currently the case for Incident_log_event, + which sets no message. + */ + if (thd->is_fatal_error || !thd->is_error()) + DBUG_RETURN(0); + + error= (error_arg == 0)? thd->stmt_da->sql_errno() : error_arg; + + /* + Temporary error codes: + currently, InnoDB deadlock detected by InnoDB or lock + wait timeout (innodb_lock_wait_timeout exceeded). + Notice, the temporary error requires slave_trans_retries != 0) + */ + if (slave_trans_retries && + (error == ER_LOCK_DEADLOCK || error == ER_LOCK_WAIT_TIMEOUT)) + DBUG_RETURN(1); + +#ifdef HAVE_NDB_BINLOG + /* + currently temporary error set in ndbcluster + */ + List_iterator_fast it(thd->warning_info->warn_list()); + MYSQL_ERROR *err; + while ((err= it++)) + { + DBUG_PRINT("info", ("has condition %d %s", err->get_sql_errno(), + err->get_message_text())); + switch (err->get_sql_errno()) + { + case ER_GET_TEMPORARY_ERRMSG: + DBUG_RETURN(1); + default: + break; + } + } +#endif + DBUG_RETURN(0); +} +#endif // EMBEDDED_LIBRARY + + void Slave_reporting_capability::report(loglevel level, int err_code, const char *msg, ...) const { +#if !defined(EMBEDDED_LIBRARY) + THD *thd= current_thd; void (*report_function)(const char *, ...); char buff[MAX_SLAVE_ERRMSG]; char *pbuff= buff; uint pbuffsize= sizeof(buff); va_list args; + + if (level == ERROR_LEVEL && has_temporary_error(thd, err_code)) + level= WARNING_LEVEL; + va_start(args, msg); mysql_mutex_lock(&err_lock); @@ -51,10 +131,12 @@ Slave_reporting_capability::report(logle report_function= sql_print_error; break; case WARNING_LEVEL: - report_function= sql_print_warning; + report_function= global_system_variables.log_warnings? + sql_print_warning : NULL; break; case INFORMATION_LEVEL: - report_function= sql_print_information; + report_function= global_system_variables.log_warnings? + sql_print_information : NULL; break; default: DBUG_ASSERT(0); // should not come here @@ -71,6 +153,7 @@ Slave_reporting_capability::report(logle m_thread_name, pbuff, (pbuff[0] && *(strend(pbuff)-1) == '.') ? "" : ",", err_code); +#endif } Slave_reporting_capability::~Slave_reporting_capability() === modified file 'sql/rpl_reporting.h' --- a/sql/rpl_reporting.h 2010-08-05 17:45:25 +0000 +++ b/sql/rpl_reporting.h 2011-03-28 13:19:08 +0000 @@ -23,6 +23,11 @@ */ #define MAX_SLAVE_ERRMSG 1024 +// todo: consider to remove rpl_reporting.cc,h from building embedded +#if !defined(EMBEDDED_LIBRARY) +class THD; +#endif + /** Mix-in to handle the message logging and reporting for relay log info and master log info structures. @@ -65,6 +70,13 @@ public: mysql_mutex_unlock(&err_lock); } +#if !defined(EMBEDDED_LIBRARY) + /** + Check if the current error is of temporary nature or not. + */ + int has_temporary_error(THD *thd, uint error_arg= 0) const; +#endif // EMBEDDED_LIBRARY + /** Error information structure. */ === modified file 'sql/rpl_slave.cc' --- a/sql/rpl_slave.cc 2011-03-29 13:44:23 +0000 +++ b/sql/rpl_slave.cc 2011-03-29 14:56:01 +0000 @@ -2518,63 +2518,6 @@ static ulong read_event(MYSQL* mysql, Ma DBUG_RETURN(len - 1); } -/* - Check if the current error is of temporary nature of not. - Some errors are temporary in nature, such as - ER_LOCK_DEADLOCK and ER_LOCK_WAIT_TIMEOUT. Ndb also signals - that the error is temporary by pushing a warning with the error code - ER_GET_TEMPORARY_ERRMSG, if the originating error is temporary. -*/ -static int has_temporary_error(THD *thd) -{ - DBUG_ENTER("has_temporary_error"); - - DBUG_EXECUTE_IF("all_errors_are_temporary_errors", - if (thd->stmt_da->is_error()) - { - thd->clear_error(); - my_error(ER_LOCK_DEADLOCK, MYF(0)); - }); - - /* - If there is no message in THD, we can't say if it's a temporary - error or not. This is currently the case for Incident_log_event, - which sets no message. Return FALSE. - */ - if (!thd->is_error()) - DBUG_RETURN(0); - - /* - Temporary error codes: - currently, InnoDB deadlock detected by InnoDB or lock - wait timeout (innodb_lock_wait_timeout exceeded - */ - if (thd->stmt_da->sql_errno() == ER_LOCK_DEADLOCK || - thd->stmt_da->sql_errno() == ER_LOCK_WAIT_TIMEOUT) - DBUG_RETURN(1); - -#ifdef HAVE_NDB_BINLOG - /* - currently temporary error set in ndbcluster - */ - List_iterator_fast it(thd->warning_info->warn_list()); - MYSQL_ERROR *err; - while ((err= it++)) - { - DBUG_PRINT("info", ("has condition %d %s", err->get_sql_errno(), - err->get_message_text())); - switch (err->get_sql_errno()) - { - case ER_GET_TEMPORARY_ERRMSG: - DBUG_RETURN(1); - default: - break; - } - } -#endif - DBUG_RETURN(0); -} - /** If this is a lagging slave (specified with CHANGE MASTER TO MASTER_DELAY = X), delays accordingly. Also unlocks rli->data_lock. @@ -2965,7 +2908,7 @@ static int exec_relay_log_event(THD* thd if (slave_trans_retries) { int UNINIT_VAR(temp_err); - if (exec_res && (temp_err= has_temporary_error(thd))) + if (exec_res && (temp_err= rli->has_temporary_error(thd))) { const char *errmsg; /* @@ -3011,10 +2954,13 @@ static int exec_relay_log_event(THD* thd } } else - sql_print_error("Slave SQL thread retried transaction %lu time(s) " - "in vain, giving up. Consider raising the value of " - "the slave_transaction_retries variable.", - slave_trans_retries); + { + thd->is_fatal_error= 1; + rli->report(ERROR_LEVEL, thd->stmt_da->sql_errno(), + "Slave SQL thread retried transaction %lu time(s) " + "in vain, giving up. Consider raising the value of " + "the slave_transaction_retries variable.", rli->trans_retries); + } } else if ((exec_res && !temp_err) || (opt_using_transactions && --===============1462643462== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/andrei.elkin@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: andrei.elkin@stripped # target_branch: file:///home/andrei/MySQL/BZR/2a-23May/MERGE/mysql-\ # trunk/ # testament_sha1: b86e84cf5752b866720ef050b3152b825fb30af1 # timestamp: 2011-03-29 17:56:19 +0300 # source_branch: file:///home/andrei/MySQL/BZR/2a-23May/FIXES\ # /bug11765758-rpl_corruption/ # base_revision_id: andrei.elkin@stripped\ # 38g5qdq7ndx855b5 # # Begin bundle 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 --===============1462643462==--