diff options
-rw-r--r-- | libmysqld/lib_sql.cc | 8 | ||||
-rw-r--r-- | mysql-test/mysql-test-run.sh | 10 | ||||
-rw-r--r-- | mysql-test/r/rpl000014.result | 8 | ||||
-rw-r--r-- | mysql-test/r/rpl000015.result | 8 | ||||
-rw-r--r-- | mysql-test/r/rpl000016.result | 10 | ||||
-rw-r--r-- | mysql-test/r/rpl_log.result | 21 | ||||
-rw-r--r-- | sql/log_event.cc | 11 | ||||
-rw-r--r-- | sql/slave.cc | 33 | ||||
-rw-r--r-- | sql/slave.h | 6 | ||||
-rw-r--r-- | sql/sql_class.h | 1 | ||||
-rw-r--r-- | tools/mysqlmanager.c | 2 |
11 files changed, 71 insertions, 47 deletions
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index 368e8909bbf..0097aa5068d 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -402,9 +402,6 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) (void) pthread_mutex_init(&LOCK_bytes_sent,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_bytes_received,MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_timezone,MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_slave_io, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_slave_sql, MY_MUTEX_INIT_FAST); - (void) pthread_mutex_init(&LOCK_server_id, MY_MUTEX_INIT_FAST); (void) pthread_mutex_init(&LOCK_user_conn, MY_MUTEX_INIT_FAST); (void) pthread_cond_init(&COND_thread_count,NULL); (void) pthread_cond_init(&COND_refresh,NULL); @@ -412,11 +409,6 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups) (void) pthread_cond_init(&COND_flush_thread_cache,NULL); (void) pthread_cond_init(&COND_manager,NULL); (void) pthread_cond_init(&COND_binlog_update, NULL); - (void) pthread_cond_init(&COND_slave_log_update, NULL); - (void) pthread_cond_init(&COND_slave_sql_stop, NULL); - (void) pthread_cond_init(&COND_slave_sql_start, NULL); - (void) pthread_cond_init(&COND_slave_sql_stop, NULL); - (void) pthread_cond_init(&COND_slave_sql_start, NULL); if (set_default_charset_by_name(default_charset, MYF(MY_WME))) { diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 3c8760ad7e5..b9ebac4445d 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -149,6 +149,7 @@ SLAVE_LOAD_TMPDIR=../../var/tmp #needs to be same length to test logging RES_SPACE=" " MYSQLD_SRC_DIRS="strings mysys include extra regex isam merge myisam \ myisammrg heap sql" +MY_LOG_DIR="$MYSQL_TEST_DIR/var/log" # # Set LD_LIBRARY_PATH if we are using shared libraries # @@ -181,8 +182,8 @@ SLEEP_TIME_FOR_FIRST_SLAVE=400 SLEEP_TIME_FOR_SECOND_SLAVE=30 CHARACTER_SET=latin1 DBUSER="" -START_WAIT_TIMEOUT=3 -STOP_WAIT_TIMEOUT=3 +START_WAIT_TIMEOUT=10 +STOP_WAIT_TIMEOUT=10 while test $# -gt 0; do case "$1" in @@ -521,7 +522,7 @@ report_stats () { deci=`$EXPR $raw - $xwhole` $ECHO "Failed ${TOT_FAIL}/${TOT_TEST} tests, ${whole}.${deci}% successful." $ECHO "" - $ECHO "The log files in $MYSQL_TEST_DIR/var/log may give you some hint" + $ECHO "The log files in $MY_LOG_DIR may give you some hint" $ECHO "of what when wrong." $ECHO "If you want to report this error, please read first the documentation at" $ECHO "http://www.mysql.com/doc/M/y/MySQL_test_suite.html" @@ -530,8 +531,7 @@ report_stats () { mysql_install_db () { $ECHO "Removing Stale Files" - $RM -rf $MASTER_MYDDIR $SLAVE_MYDDIR $SLAVE_MYLOG $MASTER_MYLOG \ - $SLAVE_MYERR $MASTER_MYERR + $RM -rf $MASTER_MYDDIR $SLAVE_MYDDIR $MY_LOG_DIR/* $ECHO "Installing Master Databases" $INSTALL_DB if [ $? != 0 ]; then diff --git a/mysql-test/r/rpl000014.result b/mysql-test/r/rpl000014.result index a0646b9c39f..78e44d824e5 100644 --- a/mysql-test/r/rpl000014.result +++ b/mysql-test/r/rpl000014.result @@ -8,21 +8,21 @@ File Position Binlog_do_db Binlog_ignore_db master-bin.001 79 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 1 master-bin.001 79 mysql-relay-bin.002 120 master-bin.001 Yes Yes 0 0 79 +127.0.0.1 root MASTER_PORT 1 master-bin.001 79 mysql-relay-bin.002 120 master-bin.001 Yes Yes 0 0 79 change master to master_log_pos=73; slave stop; change master to master_log_pos=73; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 1 master-bin.001 73 mysql-relay-bin.001 4 master-bin.001 No No 0 0 73 +127.0.0.1 root MASTER_PORT 1 master-bin.001 73 mysql-relay-bin.001 4 master-bin.001 No No 0 0 73 slave start; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 1 master-bin.001 73 mysql-relay-bin.001 4 master-bin.001 Yes Yes 0 0 73 +127.0.0.1 root MASTER_PORT 1 master-bin.001 73 mysql-relay-bin.001 4 master-bin.001 Yes Yes 0 0 73 change master to master_log_pos=173; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 1 master-bin.001 173 mysql-relay-bin.001 4 master-bin.001 Yes Yes 0 0 173 +127.0.0.1 root MASTER_PORT 1 master-bin.001 173 mysql-relay-bin.001 4 master-bin.001 Yes Yes 0 0 173 show master status; File Position Binlog_do_db Binlog_ignore_db master-bin.001 79 diff --git a/mysql-test/r/rpl000015.result b/mysql-test/r/rpl000015.result index 571c4c0b1e3..23f90ecde1f 100644 --- a/mysql-test/r/rpl000015.result +++ b/mysql-test/r/rpl000015.result @@ -9,16 +9,16 @@ Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Lo change master to master_host='127.0.0.1'; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 test 3306 60 4 mysql-relay-bin.001 4 No No 0 0 0 +127.0.0.1 test MASTER_PORT 60 4 mysql-relay-bin.001 4 No No 0 0 0 change master to master_host='127.0.0.1',master_user='root', -master_password='',master_port=9306; +master_password='',master_port=MASTER_PORT; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 60 4 mysql-relay-bin.001 4 No No 0 0 0 +127.0.0.1 root MASTER_PORT 60 4 mysql-relay-bin.001 4 No No 0 0 0 slave start; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 60 master-bin.001 79 mysql-relay-bin.001 120 master-bin.001 Yes Yes 0 0 79 +127.0.0.1 root MASTER_PORT 60 master-bin.001 79 mysql-relay-bin.001 120 master-bin.001 Yes Yes 0 0 79 drop table if exists t1; create table t1 (n int); insert into t1 values (10),(45),(90); diff --git a/mysql-test/r/rpl000016.result b/mysql-test/r/rpl000016.result index e3510ec2d94..dae60021157 100644 --- a/mysql-test/r/rpl000016.result +++ b/mysql-test/r/rpl000016.result @@ -2,11 +2,11 @@ slave start; Could not initialize master info structure, check permisions on master.info slave start; Could not initialize master info structure, check permisions on master.info -change master to master_host='127.0.0.1',master_port=9306, +change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root'; Could not initialize master info reset slave; -change master to master_host='127.0.0.1',master_port=9306, +change master to master_host='127.0.0.1',master_port=MASTER_PORT, master_user='root'; reset master; slave start; @@ -15,7 +15,7 @@ create table t1 (s text); insert into t1 values('Could not break slave'),('Tried hard'); show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 60 master-bin.001 234 mysql-relay-bin.001 275 master-bin.001 Yes Yes 0 0 234 +127.0.0.1 root MASTER_PORT 60 master-bin.001 234 mysql-relay-bin.001 275 master-bin.001 Yes Yes 0 0 234 select * from t1; s Could not break slave @@ -43,7 +43,7 @@ master-bin.003 insert into t2 values (65); show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 60 master-bin.003 155 mysql-relay-bin.001 793 master-bin.003 Yes Yes 0 0 155 +127.0.0.1 root MASTER_PORT 60 master-bin.003 155 mysql-relay-bin.001 793 master-bin.003 Yes Yes 0 0 155 select * from t2; m 34 @@ -66,7 +66,7 @@ slave stop; slave start; show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 60 master-bin.006 445 mysql-relay-bin.004 1376 master-bin.006 Yes Yes 0 0 445 +127.0.0.1 root MASTER_PORT 60 master-bin.006 445 mysql-relay-bin.004 1312 master-bin.006 Yes Yes 0 0 445 lock tables t3 read; select count(*) from t3 where n >= 4; count(*) diff --git a/mysql-test/r/rpl_log.result b/mysql-test/r/rpl_log.result index 4e6588d39f2..9b7ff276828 100644 --- a/mysql-test/r/rpl_log.result +++ b/mysql-test/r/rpl_log.result @@ -16,7 +16,7 @@ load data infile '../../std_data/words.dat' into table t1; drop table t1; show binlog events; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 4 Start 1 4 Server ver: 4.0.1-alpha-debug-log, Binlog ver: 3 +master-bin.001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key) master-bin.001 172 Intvar 1 172 INSERT_ID=1 master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL) @@ -41,7 +41,7 @@ insert into t1 values (1); drop table t1; show binlog events; Log_name Pos Event_type Server_id Orig_log_pos Info -master-bin.001 4 Start 1 4 Server ver: 4.0.1-alpha-debug-log, Binlog ver: 3 +master-bin.001 4 Start 1 4 Server ver: VERSION, Binlog ver: 3 master-bin.001 79 Query 1 79 use test; create table t1(n int not null auto_increment primary key) master-bin.001 172 Intvar 1 172 INSERT_ID=1 master-bin.001 200 Query 1 200 use test; insert into t1 values (NULL) @@ -67,28 +67,15 @@ Log_name slave-bin.001 slave-bin.002 show binlog events in 'slave-bin.001' from 4; -Log_name Pos Event_type Server_id Orig_log_pos Info -slave-bin.001 4 Start 2 4 Server ver: 4.0.1-alpha-debug-log, Binlog ver: 3 -slave-bin.001 79 Slave 2 79 host=127.0.0.1,port=9306,log=master-bin.001,pos=4 -slave-bin.001 132 Query 1 79 use test; create table t1(n int not null auto_increment primary key) -slave-bin.001 225 Intvar 1 200 INSERT_ID=1 -slave-bin.001 253 Query 1 200 use test; insert into t1 values (NULL) -slave-bin.001 316 Query 1 263 use test; drop table t1 -slave-bin.001 364 Query 1 311 use test; create table t1 (word char(20) not null) -slave-bin.001 439 Create_file 1 386 db=test;table=t1;file_id=1;block_len=81 -slave-bin.001 618 Exec_load 1 556 ;file_id=1 -slave-bin.001 641 Query 1 579 use test; drop table t1 -slave-bin.001 689 Rotate 1 627 slave-bin.002;pos=4; forced by master -slave-bin.001 729 Stop 2 729 show binlog events in 'slave-bin.002' from 4; Log_name Pos Event_type Server_id Orig_log_pos Info -slave-bin.002 4 Slave 2 627 host=127.0.0.1,port=9306,log=master-bin.002,pos=4 +slave-bin.002 4 Slave 2 627 host=127.0.0.1,port=MASTER_PORT,log=master-bin.002,pos=4 slave-bin.002 57 Query 1 4 use test; create table t1 (n int) slave-bin.002 115 Query 1 62 use test; insert into t1 values (1) slave-bin.002 175 Query 1 122 use test; drop table t1 show slave status; Master_Host Master_User Master_Port Connect_retry Master_Log_File Read_Master_Log_Pos Relay_Log_File Relay_Log_Pos Relay_Master_Log_File Slave_IO_Running Slave_SQL_Running Replicate_do_db Replicate_ignore_db Last_errno Last_error Skip_counter Exec_master_log_pos -127.0.0.1 root 9306 1 master-bin.002 170 mysql-relay-bin.002 935 master-bin.002 Yes Yes 0 0 170 +127.0.0.1 root MASTER_PORT 1 master-bin.002 170 mysql-relay-bin.002 935 master-bin.002 Yes Yes 0 0 170 show new master for slave with master_log_file='master-bin.001' and master_log_pos=4 and master_server_id=1; Log_name Log_pos diff --git a/sql/log_event.cc b/sql/log_event.cc index 7eb7c57ae40..e10352e6c48 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -53,6 +53,11 @@ static void pretty_print_str(FILE* file, char* str, int len) #ifndef MYSQL_CLIENT +inline int ignored_error_code(int err_code) +{ + return use_slave_mask && bitmap_is_set(&slave_error_mask, err_code); +} + static void pretty_print_str(String* packet, char* str, int len) { @@ -1564,7 +1569,8 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) // sanity check to make sure the master did not get a really bad // error on the query - if (!check_expected_error(thd,rli,(expected_error = error_code))) + if (ignored_error_code((expected_error = error_code)) || + !check_expected_error(thd,rli,expected_error)) { mysql_parse(thd, thd->query, q_len); if (expected_error != @@ -1578,7 +1584,8 @@ int Query_log_event::exec_event(struct st_relay_log_info* rli) actual_error); thd->query_error = 1; } - else if (expected_error == actual_error) + else if (expected_error == actual_error + || ignored_error_code(actual_error)) { thd->query_error = 0; *rli->last_slave_error = 0; diff --git a/sql/slave.cc b/sql/slave.cc index e68741e7434..3d38a7e6f4b 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -26,6 +26,9 @@ #include <my_dir.h> #include <assert.h> +bool use_slave_mask = 0; +MY_BITMAP slave_error_mask; + volatile bool slave_sql_running = 0, slave_io_running = 0; char* slave_load_tmpdir = 0; MASTER_INFO main_mi; @@ -219,6 +222,36 @@ err: return (*errmsg) ? 1 : 0; } +/* called from get_options() in mysqld.cc on start-up */ +void init_slave_skip_errors(char* arg) +{ + char* p; + my_bool last_was_digit = 0; + if (bitmap_init(&slave_error_mask,MAX_SLAVE_ERROR,0)) + { + fprintf(stderr, "Badly out of memory, please check your system status\n"); + exit(1); + } + use_slave_mask = 1; + for (;isspace(*arg);++arg) + /* empty */; + if (!my_casecmp(arg,"all",3)) + { + bitmap_set_all(&slave_error_mask); + return; + } + for (p= arg ; *p; ) + { + long err_code; + if (!(p= str2int(p, 10, 0, LONG_MAX, &err_code))) + break; + if (err_code < MAX_SLAVE_ERROR) + bitmap_set_bit(&slave_error_mask,(uint)err_code); + while (!isdigit(*p) && *p) + p++; + } +} + // we assume we have a run lock on rli and that the both slave thread // are not running int purge_relay_logs(RELAY_LOG_INFO* rli, bool just_reset, const char** errmsg) diff --git a/sql/slave.h b/sql/slave.h index 9ad5c75a556..f1dd0130500 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -5,6 +5,7 @@ #include "my_list.h" #define SLAVE_NET_TIMEOUT 3600 #define MAX_SLAVE_ERRMSG 1024 +#define MAX_SLAVE_ERROR 2000 /* The replication is accomplished by starting two threads - I/O @@ -24,12 +25,16 @@ */ extern ulong slave_net_timeout, master_retry_count; +extern MY_BITMAP slave_error_mask; +extern bool use_slave_mask; extern char* slave_load_tmpdir; extern my_string master_info_file,relay_log_info_file; extern my_string opt_relay_logname, opt_relaylog_index_name; extern bool opt_skip_slave_start; struct st_master_info; +// TODO: this needs to be redone, but for now it does not matter since +// we do not have multi-master yet. #define LOCK_ACTIVE_MI { pthread_mutex_lock(&LOCK_active_mi); \ ++active_mi_in_use; \ pthread_mutex_unlock(&LOCK_active_mi);} @@ -286,6 +291,7 @@ typedef struct st_table_rule_ent */ int init_slave(); +void init_slave_skip_errors(char* arg); int flush_master_info(MASTER_INFO* mi); int flush_relay_log_info(RELAY_LOG_INFO* rli); int register_slave_on_master(MYSQL* mysql); diff --git a/sql/sql_class.h b/sql/sql_class.h index 5b155e6b3d4..a34975bc77e 100644 --- a/sql/sql_class.h +++ b/sql/sql_class.h @@ -312,7 +312,6 @@ public: struct st_my_thread_var *mysys_var; enum enum_server_command command; uint32 server_id; - uint32 file_id; // for LOAD DATA INFILE uint32 file_id; // for LOAD DATA INFILE const char *where; time_t start_time,time_after_lock,user_time; diff --git a/tools/mysqlmanager.c b/tools/mysqlmanager.c index c8b7803790c..bd43c6bc0ec 100644 --- a/tools/mysqlmanager.c +++ b/tools/mysqlmanager.c @@ -1155,7 +1155,7 @@ static int client_msg_raw(NET* net, int err_code, int pre, const char* fmt, p=buf_end - 2; *p++='\r'; *p++='\n'; - + log_debug("message to client: %-.*s",p-buf-2,buf); if (my_net_write(net,buf,(uint)(p-buf)) || net_flush(net)) { p[-2]=0; |