3345 Andrei Elkin 2011-03-29 [merge]
merge from the main repo to local mysql-trunk prior to push
removed:
include/my_handler.h
mysys/my_gethostbyname.c
mysys/my_handler.c
mysys/my_port.c
added:
include/my_compare.h
mysys/my_compare.c
modified:
extra/perror.c
extra/yassl/src/ssl.cpp
extra/yassl/taocrypt/include/asn.hpp
include/heap.h
include/my_global.h
include/my_net.h
include/myisam.h
mysys/CMakeLists.txt
mysys/my_handler_errors.h
sql/handler.h
storage/innobase/row/row0sel.c
storage/myisam/ft_stopwords.c
storage/myisam/mi_check.c
storage/myisam/mi_range.c
=== modified file 'client/mysqlbinlog.cc'
--- a/client/mysqlbinlog.cc 2011-03-25 15:20:25 +0000
+++ b/client/mysqlbinlog.cc 2011-03-29 13:56:27 +0000
@@ -1681,8 +1681,7 @@ static Exit_status dump_remote_log_entri
*/
ev->register_temp_buf((char *) net->read_pos + 1);
}
- if (glob_description_event->binlog_version >= 3 ||
- (type != LOAD_EVENT && type != CREATE_FILE_EVENT))
+ if (raw_mode || (type != LOAD_EVENT))
{
/*
If this is a Rotate event, maybe it's the end of the requested binlog;
@@ -1771,6 +1770,14 @@ static Exit_status dump_remote_log_entri
ev= 0;
}
}
+
+ if (type == LOAD_EVENT)
+ {
+ DBUG_ASSERT(raw_mode);
+ warning("Attempting to load a remote pre-4.0 binary log that contains "
+ "LOAD DATA INFILE statements. The file will not be copied from "
+ "the remote server. ");
+ }
if (raw_mode)
{
=== 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/extra/rpl_tests/rpl_get_master_version_and_clock.test'
--- a/mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test 2010-12-19 17:22:30 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_get_master_version_and_clock.test 2011-03-17 18:13:10 +0000
@@ -71,6 +71,13 @@ source include/wait_for_slave_io_error.i
# now to avoid restarting IO-thread to re-enter it.
# There will be a new IO thread forked out with its @@session.debug
# unset.
+
+#
+# Note, due to # Bug#11765758 - 58754
+# make sure the slave threads stand still (SQL thread in this context)
+# while @@global.debug is being updated.
+#
+
eval set @@global.debug = "-d,$dbug_sync_point";
--let $rpl_server_number= 1
=== modified file 'mysql-test/extra/rpl_tests/rpl_stop_middle_group.test'
--- a/mysql-test/extra/rpl_tests/rpl_stop_middle_group.test 2011-03-17 13:20:36 +0000
+++ b/mysql-test/extra/rpl_tests/rpl_stop_middle_group.test 2011-03-29 13:44:23 +0000
@@ -47,6 +47,7 @@ source include/wait_for_slave_sql_to_sto
--let $assert_cond= [SELECT COUNT(*) AS Val FROM ti, Val, 1] = 1
--source include/assert.inc
+--source include/stop_slave.inc
set @@global.debug="-d";
#
@@ -104,12 +105,15 @@ let $slave_sql_errno= 1593; # ER_SLAVE_F
--let $assert_cond= [SELECT COUNT(*) AS Val FROM ti, Val, 1] = 0
--source include/assert.inc
+--source include/stop_slave.inc
set @@global.debug="-d";
#
# The mixed multi-table update
#
-stop slave;
+
+# above tests for Bug#11765758 - 58754 made sure slave is down
+
truncate table tm;
source include/start_slave.inc;
@@ -146,6 +150,7 @@ let $slave_sql_errno= 1593; # ER_SLAVE_F
--let $assert_cond= [SELECT MAX(a) AS Val FROM ti, Val, 1] = 1
--source include/assert.inc
+--source include/stop_slave.inc
set @@global.debug="-d";
#
=== modified file 'mysql-test/suite/rpl/r/rpl_corruption.result'
--- a/mysql-test/suite/rpl/r/rpl_corruption.result 2011-03-13 19:56:40 +0000
+++ b/mysql-test/suite/rpl/r/rpl_corruption.result 2011-03-17 18:13:10 +0000
@@ -12,32 +12,32 @@ SET @old_master_verify_checksum = @@mast
CREATE TABLE t1 (a INT NOT NULL PRIMARY KEY, b VARCHAR(10), c VARCHAR(100));
include/stop_slave.inc
# 2. Corruption in master binlog and SHOW BINLOG EVENTS
-SET GLOBAL debug="d,corrupt_read_log_event_char";
+SET GLOBAL debug="+d,corrupt_read_log_event_char";
SHOW BINLOG EVENTS;
ERROR HY000: Error when executing command SHOW BINLOG EVENTS: Wrong offset or I/O error
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event_char";
# 3. Master read a corrupted event from binlog and send the error to slave
-SET GLOBAL debug="d,corrupt_read_log_event";
+SET GLOBAL debug="+d,corrupt_read_log_event";
START SLAVE IO_THREAD;
include/wait_for_slave_io_error.inc [errno=1236]
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event";
# 4. Master read a corrupted event from binlog and send it to slave
SET GLOBAL master_verify_checksum=0;
-SET GLOBAL debug="d,corrupt_read_log_event";
+SET GLOBAL debug="+d,corrupt_read_log_event";
START SLAVE IO_THREAD;
include/wait_for_slave_io_error.inc [errno=1595,1722]
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event";
SET GLOBAL master_verify_checksum=1;
# 5. Slave. Corruption in network
-SET GLOBAL debug="d,corrupt_queue_event";
+SET GLOBAL debug="+d,corrupt_queue_event";
START SLAVE IO_THREAD;
include/wait_for_slave_io_error.inc [errno=1595,1722]
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_queue_event";
# 6. Slave. Corruption in relay log
-SET GLOBAL debug="d,corrupt_read_log_event_char";
-START SLAVE;
+SET GLOBAL debug="+d,corrupt_read_log_event_char";
+START SLAVE SQL_THREAD;
include/wait_for_slave_sql_error.inc [errno=1593]
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event_char";
# 7. Seek diff for tables on master and slave
include/start_slave.inc
include/diff_tables.inc [master:t1, slave:t1]
=== 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 'mysql-test/suite/rpl/r/rpl_init_slave_errors.result'
--- a/mysql-test/suite/rpl/r/rpl_init_slave_errors.result 2011-02-23 09:31:37 +0000
+++ b/mysql-test/suite/rpl/r/rpl_init_slave_errors.result 2011-03-21 16:04:11 +0000
@@ -7,6 +7,7 @@ start slave;
include/wait_for_slave_sql_error.inc [errno=1593]
Last_SQL_Error = 'Failed during slave thread initialization'
call mtr.add_suppression("Failed during slave.* thread initialization");
+# Asserted this: SHOW SLAVE STATUS should return No IO thread running status
SET GLOBAL debug= "";
reset slave;
SET GLOBAL init_slave= "garbage";
=== modified file 'mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result'
--- a/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result 2011-03-17 13:20:36 +0000
+++ b/mysql-test/suite/rpl/r/rpl_stm_stop_middle_group.result 2011-03-29 13:44:23 +0000
@@ -18,6 +18,7 @@ include/check_slave_no_error.inc
include/assert.inc [Everything that was read, was executed]
include/assert.inc [There is one row in table tm]
include/assert.inc [There is one row in table ti]
+include/stop_slave.inc
set @@global.debug="-d";
include/start_slave.inc
truncate table tm;
@@ -35,8 +36,8 @@ Last_SQL_Error = 'Fatal error: ... Slave
include/assert.inc [Not everything that was read, was executed]
include/assert.inc [There is one row in table tm]
include/assert.inc [There is no row in table ti]
+include/stop_slave.inc
set @@global.debug="-d";
-stop slave;
truncate table tm;
include/start_slave.inc
set @@global.debug="+d,stop_slave_middle_group";
@@ -47,6 +48,7 @@ Last_SQL_Error = 'Fatal error: ... Slave
include/assert.inc [Not everything that was read, was executed]
include/assert.inc [The max value for field 'a' is 2]
include/assert.inc [The max value for field 'a' is 1]
+include/stop_slave.inc
set @@global.debug="-d";
include/rpl_reset.inc
drop table tm, ti;
=== modified file 'mysql-test/suite/rpl/t/rpl_corruption.test'
--- a/mysql-test/suite/rpl/t/rpl_corruption.test 2011-03-13 19:56:40 +0000
+++ b/mysql-test/suite/rpl/t/rpl_corruption.test 2011-03-17 18:13:10 +0000
@@ -7,6 +7,14 @@
# - in relay log
############################################################
+#
+# The tests intensively utilize @@global.debug. Note,
+# Bug#11765758 - 58754,
+# @@global.debug is read by the slave threads through dbug-interface.
+# Hence, before a client thread set @@global.debug we have to ensure that:
+# (a) the slave threads are stopped, or (b) the slave threads are in
+# sync and waiting.
+
--source include/have_debug.inc
--source include/master-slave.inc
@@ -56,17 +64,10 @@ while ($i) {
}
--enable_query_log
-#
-# Bug #58630 shows `+d' syntax has a side effect Andrei changed it to
-# unsigned `d' version which does not affect the tests logics.
-# todo:
-# restore *all* following `SET GLOBAL debug' back to `+|-d' when Bug
-# #58630, OBug#11765758 sorted out
-#
# Emulate corruption in binlog file when SHOW BINLOG EVENTS is executing
--echo # 2. Corruption in master binlog and SHOW BINLOG EVENTS
-SET GLOBAL debug="d,corrupt_read_log_event_char";
+SET GLOBAL debug="+d,corrupt_read_log_event_char";
--echo SHOW BINLOG EVENTS;
--disable_query_log
send_eval SHOW BINLOG EVENTS FROM $pos;
@@ -74,50 +75,50 @@ send_eval SHOW BINLOG EVENTS FROM $pos;
--error ER_ERROR_WHEN_EXECUTING_COMMAND
reap;
-# see above comments on `+d' syntax
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event_char";
# Emulate corruption on master with crc checking on master
--echo # 3. Master read a corrupted event from binlog and send the error to slave
-SET GLOBAL debug="d,corrupt_read_log_event";
+SET GLOBAL debug="+d,corrupt_read_log_event";
--connection slave
START SLAVE IO_THREAD;
let $slave_io_errno= 1236;
--source include/wait_for_slave_io_error.inc
--connection master
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event";
# Emulate corruption on master without crc checking on master
--echo # 4. Master read a corrupted event from binlog and send it to slave
--connection master
SET GLOBAL master_verify_checksum=0;
-SET GLOBAL debug="d,corrupt_read_log_event";
+SET GLOBAL debug="+d,corrupt_read_log_event";
--connection slave
START SLAVE IO_THREAD;
let $slave_io_errno= 1595,1722;
--source include/wait_for_slave_io_error.inc
--connection master
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event";
SET GLOBAL master_verify_checksum=1;
# Emulate corruption in network
--echo # 5. Slave. Corruption in network
--connection slave
-SET GLOBAL debug="d,corrupt_queue_event";
+SET GLOBAL debug="+d,corrupt_queue_event";
START SLAVE IO_THREAD;
let $slave_io_errno= 1595,1722;
--source include/wait_for_slave_io_error.inc
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_queue_event";
# Emulate corruption in relay log
--echo # 6. Slave. Corruption in relay log
-SET GLOBAL debug="d,corrupt_read_log_event_char";
-START SLAVE;
+SET GLOBAL debug="+d,corrupt_read_log_event_char";
+
+START SLAVE SQL_THREAD;
let $slave_sql_errno= 1593;
--source include/wait_for_slave_sql_error.inc
-SET GLOBAL debug="";
+SET GLOBAL debug="-d,corrupt_read_log_event_char";
# Start normal replication and compare same table on master
# and slave
=== modified file 'mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test'
--- a/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test 2010-12-19 17:22:30 +0000
+++ b/mysql-test/suite/rpl/t/rpl_get_master_version_and_clock.test 2011-03-17 18:13:10 +0000
@@ -47,6 +47,11 @@ let $dbug_sync_point= 'dbug.before_get_M
let $debug_sync_action= 'now SIGNAL signal.get_master_uuid';
source extra/rpl_tests/rpl_get_master_version_and_clock.test;
+#
+# Note, due to # Bug#11765758 - 58754
+# make sure the slave threads stand still (SQL thread in this context)
+# while @@global.debug is being updated.
+#
eval set global debug= '$debug_saved';
#Test case 4: This test checks that the slave I/O thread refuses to start
=== modified file 'mysql-test/suite/rpl/t/rpl_init_slave_errors.test'
--- a/mysql-test/suite/rpl/t/rpl_init_slave_errors.test 2011-02-23 09:31:37 +0000
+++ b/mysql-test/suite/rpl/t/rpl_init_slave_errors.test 2011-03-21 16:04:11 +0000
@@ -60,6 +60,14 @@ start slave;
call mtr.add_suppression("Failed during slave.* thread initialization");
+# Bug#11765758 - 58754
+# above tests part logics make sure the IO thread is down to allow
+# safe updating to @@global.debug
+
+--let $assert_text= SHOW SLAVE STATUS should return No IO thread running status
+--let $assert_cond= "[SHOW SLAVE STATUS, Slave_IO_Running, 1]" like "No"
+--source include/rpl_assert.inc
+
SET GLOBAL debug= "";
######################################################################
=== modified file 'mysql-test/suite/rpl/t/rpl_show_slave_running.test'
--- a/mysql-test/suite/rpl/t/rpl_show_slave_running.test 2010-12-19 17:22:30 +0000
+++ b/mysql-test/suite/rpl/t/rpl_show_slave_running.test 2011-03-17 18:13:10 +0000
@@ -76,9 +76,17 @@ echo Slave_SQL_Running= $status;
# cleanup
-connection slave;
+connection master;
+
+# Bug#11765758 - 58754
+# @@global.debug is read by the slave threads through dbug-interface.
+# Hence, before a client thread set @@global.debug we have to ensure that:
+# (a) the slave threads are stopped, or (b) the slave threads are in
+# sync and waiting.
+sync_slave_with_master;
eval set global debug= '$debug_saved';
+
SET DEBUG_SYNC= 'RESET';
--echo End of tests
--source include/rpl_end.inc
=== 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<MYSQL_ERROR> 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-17 17:39:31 +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<MYSQL_ERROR> 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 &&
@@ -4376,7 +4322,7 @@ static int queue_event(Master_info* mi,c
int debug_cor_pos = rand() % (event_len - BINLOG_CHECKSUM_LEN);
debug_event_buf_c[debug_cor_pos] =~ debug_event_buf_c[debug_cor_pos];
DBUG_PRINT("info", ("Corrupt the event at queue_event: byte on position %d", debug_cor_pos));
- DBUG_SET("");
+ DBUG_SET("-d,corrupt_queue_event");
}
);
Attachment: [text/bzr-bundle] bzr/andrei.elkin@oracle.com-20110329145716-hpp1cnld04yxc9ne.bundle
| Thread |
|---|
| • bzr push into mysql-trunk branch (andrei.elkin:3345) | Andrei Elkin | 29 Mar |