From 262a9e41e164b1ddbb1763622bf5617d3685f74a Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 24 Jan 2001 09:15:34 -0700 Subject: Added last_errno and last_error to show slave status slave will skip the first SQL_SLAVE_SKIP_COUNTER events on start - this is needed to recover from broken replication when the next log event(s) should just be skipped. Rotate binlogs when max_binlog_size is reached include/my_sys.h: added my_snprintf() include/mysqld_error.h: more error messages mysql-test/r/rpl000014.result: updated results for new SHOW SLAVE STATUS format mysql-test/r/rpl000015.result: update for SHOW SLAVE STATUS mysql-test/r/rpl000016.result: update for additions to the test mysql-test/t/rpl000016.test: test max_binlog_size and slave_skip_counter mysys/my_vsnprintf.c: added my_snprintf() sql/gen_lex_hash.cc: old values could not do it sql/lex.h: updates for SQL_SLAVE_SKIP_COUNTER sql/log.cc: rotate binlogs when max_binlog_size is reached sql/mysqld.cc: added max_binlog_size sql/share/czech/errmsg.txt: new errors sql/share/danish/errmsg.txt: new errors sql/share/dutch/errmsg.txt: new errors sql/share/english/errmsg.txt: new errors sql/share/estonian/errmsg.txt: new errors sql/share/french/errmsg.txt: new errors sql/share/german/errmsg.txt: new errors sql/share/greek/errmsg.txt: new errors sql/share/hungarian/errmsg.txt: new errors sql/share/italian/errmsg.txt: new errors sql/share/japanese/errmsg.txt: new errors sql/share/korean/errmsg.txt: new errors sql/share/norwegian-ny/errmsg.txt: new errors sql/share/norwegian/errmsg.txt: new errors sql/share/polish/errmsg.txt: new errors sql/share/portuguese/errmsg.txt: new errors sql/share/romanian/errmsg.txt: new errors sql/share/russian/errmsg.txt: new errors, translated untranslated messages sql/share/slovak/errmsg.txt: new errors sql/share/spanish/errmsg.txt: new errors sql/share/swedish/errmsg.txt: new errors sql/slave.cc: updates for slave_skip_counter and extension to show slave status sql/slave.h: slave_skip_counter sql/sql_repl.cc: use error messages from errmsg.txt sql/sql_yacc.yy: skip_slave_counter --- sql/slave.cc | 39 ++++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) (limited to 'sql/slave.cc') diff --git a/sql/slave.cc b/sql/slave.cc index 667440e4026..a798af7e0ed 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -34,10 +34,13 @@ DYNAMIC_ARRAY replicate_wild_do_table, replicate_wild_ignore_table; bool do_table_inited = 0, ignore_table_inited = 0; bool wild_do_table_inited = 0, wild_ignore_table_inited = 0; bool table_rules_on = 0; - +uint32 slave_skip_counter = 0; +static TABLE* save_temporary_tables = 0; // when slave thread exits, we need to remember the temporary tables so we // can re-use them on slave start -static TABLE* save_temporary_tables = 0; + +static int last_slave_errno = 0; +static char last_slave_error[1024] = ""; #ifndef DBUG_OFF int disconnect_slave_event_count = 0, abort_slave_event_count = 0; static int events_till_disconnect = -1, events_till_abort = -1; @@ -570,6 +573,9 @@ int show_master_info(THD* thd) field_list.push_back(new Item_empty_string("Slave_Running", 3)); field_list.push_back(new Item_empty_string("Replicate_do_db", 20)); field_list.push_back(new Item_empty_string("Replicate_ignore_db", 20)); + field_list.push_back(new Item_empty_string("Last_errno", 4)); + field_list.push_back(new Item_empty_string("Last_error", 20)); + field_list.push_back(new Item_empty_string("Skip_counter", 12)); if(send_fields(thd, field_list, 1)) DBUG_RETURN(-1); @@ -589,6 +595,9 @@ int show_master_info(THD* thd) pthread_mutex_unlock(&LOCK_slave); net_store_data(packet, &replicate_do_db); net_store_data(packet, &replicate_ignore_db); + net_store_data(packet, (uint32)last_slave_errno); + net_store_data(packet, last_slave_error); + net_store_data(packet, slave_skip_counter); if (my_net_write(&thd->net, (char*)thd->packet.ptr(), packet->length())) DBUG_RETURN(-1); @@ -833,13 +842,14 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) if (ev) { int type_code = ev->get_type_code(); - if (ev->server_id == ::server_id) + if (ev->server_id == ::server_id || slave_skip_counter) { if(type_code == LOAD_EVENT) skip_load_data_infile(net); mi->inc_pos(event_len); flush_master_info(mi); + --slave_skip_counter; delete ev; return 0; // avoid infinite update loops } @@ -853,6 +863,7 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) { Query_log_event* qev = (Query_log_event*)ev; int q_len = qev->q_len; + int expected_error,actual_error = 0; init_sql_alloc(&thd->mem_root, 8192,0); thd->db = rewrite_db((char*)qev->db); if (db_ok(thd->db, replicate_do_db, replicate_ignore_db)) @@ -869,19 +880,22 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) thd->net.last_error[0] = 0; thd->slave_proxy_id = qev->thread_id; // for temp tables mysql_parse(thd, thd->query, q_len); - int expected_error,actual_error; if ((expected_error = qev->error_code) != (actual_error = thd->net.last_errno) && expected_error) { - sql_print_error("Slave: did not get the expected error\ - running query from master - expected: '%s', got '%s'", - ER(expected_error), - actual_error ? ER(actual_error):"no error" + const char* errmsg = "Slave: did not get the expected error\ + running query from master - expected: '%s', got '%s'"; + sql_print_error(errmsg, ER(expected_error), + actual_error ? thd->net.last_error:"no error" ); thd->query_error = 1; } else if (expected_error == actual_error) - thd->query_error = 0; + { + thd->query_error = 0; + *last_slave_error = 0; + last_slave_errno = 0; + } } thd->db = 0; // prevent db from being freed thd->query = 0; // just to be sure @@ -893,6 +907,13 @@ static int exec_event(THD* thd, NET* net, MASTER_INFO* mi, int event_len) { sql_print_error("Slave: error running query '%s' ", qev->query); + last_slave_errno = actual_error ? actual_error : -1; + my_snprintf(last_slave_error, sizeof(last_slave_error), + "error '%s' on query '%s'", + actual_error ? thd->net.last_error : + "unexpected success or fatal error", + qev->query + ); free_root(&thd->mem_root,0); delete ev; return 1; -- cgit v1.2.1 From b302ee39bc8e5f26f3fe95b47a3f42ad11cc5f40 Mon Sep 17 00:00:00 2001 From: unknown Date: Wed, 24 Jan 2001 12:47:09 -0700 Subject: fixed improper read of log name from master.info which broke slave server restart fixed sync bugs in three test cases added offset argument to sync_with_master to mysqltest to be able to fix sync bugs added a test case for slave startup with existing master.info expanded mysql-test-run.sh to be able to run pre-start shell script initializations client/mysqltest.c: added offset argument to sync_with_master mysql-test/mysql-test-run.sh: added option to run master or slave initialization shell script mysql-test/r/rpl000016.result: fixed bug in test case mysql-test/t/rpl000012.test: fixed syncronization bug mysql-test/t/rpl000013.test: fixed sync bug mysql-test/t/rpl000016.test: fixed ambiguous show slave status. sql/slave.cc: fixed bug that broke slave server start with existing master.info, Monty's optimization was not chopping off newline from logname. --- sql/slave.cc | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'sql/slave.cc') diff --git a/sql/slave.cc b/sql/slave.cc index a798af7e0ed..58d1d173968 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -509,14 +509,14 @@ int init_master_info(MASTER_INFO* mi) return 1; } - if (!(length=my_b_gets(&mi->file, mi->log_file_name, - sizeof(mi->log_file_name)))) + if ((length=my_b_gets(&mi->file, mi->log_file_name, + sizeof(mi->log_file_name))) < 1) { msg="Error reading log file name from master info file "; goto error; } - mi->log_file_name[length]= 0; // kill \n + mi->log_file_name[length-1]= 0; // kill \n char buf[FN_REFLEN]; if(!my_b_gets(&mi->file, buf, sizeof(buf))) { -- cgit v1.2.1