diff options
author | unknown <sasha@mysql.sashanet.com> | 2002-01-24 22:49:47 -0700 |
---|---|---|
committer | unknown <sasha@mysql.sashanet.com> | 2002-01-24 22:49:47 -0700 |
commit | de172721edc0d619f12ea9769373fa0d7fcfbeb5 (patch) | |
tree | dbd006cf3d35d4daf9ae21af895de3a3261faf0b /sql/slave.cc | |
parent | 1c2802931e0ac2c328d5a0caa8955e774048bbb3 (diff) | |
download | mariadb-git-de172721edc0d619f12ea9769373fa0d7fcfbeb5.tar.gz |
more predicatable slave behaviour with wait_for_slave_stop in mysqltest
fixed a couple of bugs with SEQ_READ_APPEND cache
rpl000016 still has non-deterministic result, but I am going to commit and
push since what I have is now better than what is in the main repository
client/mysqltest.c:
added wait_for_slave_to_stop
cleaned up TODO and comments
include/my_sys.h:
fixed race in flush_io_cache in SEQ_READ_APPEND cache
mysql-test/r/rpl000016.result:
updated result
mysql-test/t/rpl000016.test:
use wait_for_slave_to_stop to have deterministic slave behaviour for the test
mysys/mf_iocache.c:
fixed race in flush_io_cache()
fixed failure to unlock mutex in my_b_append()
sql/log.cc:
be compatible with 3.23 master
sql/log_event.cc:
3.23 master compat
sql/slave.cc:
3.23 master compat
sql/sql_class.h:
compat with 3.23 master
Diffstat (limited to 'sql/slave.cc')
-rw-r--r-- | sql/slave.cc | 89 |
1 files changed, 72 insertions, 17 deletions
diff --git a/sql/slave.cc b/sql/slave.cc index 3d38a7e6f4b..97efbf6036c 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -54,6 +54,9 @@ static int stuck_count = 0; typedef enum { SLAVE_THD_IO, SLAVE_THD_SQL} SLAVE_THD_TYPE; void skip_load_data_infile(NET* net); +static int process_io_rotate(MASTER_INFO* mi, Rotate_log_event* rev); +static int queue_old_event(MASTER_INFO* mi, const char* buf, + uint event_len); static inline bool slave_killed(THD* thd,MASTER_INFO* mi); static inline bool slave_killed(THD* thd,RELAY_LOG_INFO* rli); static int init_slave_thread(THD* thd, SLAVE_THD_TYPE thd_type); @@ -1918,34 +1921,86 @@ the slave SQL thread with \"mysqladmin start-slave\". We stopped at log \ DBUG_RETURN(0); // Can't return anything here } +static int process_io_rotate(MASTER_INFO* mi, Rotate_log_event* rev) +{ + if (!rev->is_valid()) + return 1; + DBUG_ASSERT(rev->ident_len<sizeof(mi->master_log_name)); + memcpy(mi->master_log_name,rev->new_log_ident, + rev->ident_len); + mi->master_log_name[rev->ident_len] = 0; + mi->master_log_pos = rev->pos; +#ifndef DBUG_OFF + /* if we do not do this, we will be getting the first + rotate event forever, so + we need to not disconnect after one + */ + if (disconnect_slave_event_count) + events_till_disconnect++; +#endif + return 0; +} + +static int queue_old_event(MASTER_INFO* mi, const char* buf, + uint event_len) +{ + const char* errmsg = 0; + bool inc_pos = 1; + Log_event* ev = Log_event::read_log_event(buf,event_len, &errmsg, + 1/*old format*/); + if (!ev) + { + sql_print_error("Read invalid event from master: '%s',\ + master could be corrupt but a more likely cause of this is a bug", + errmsg); + return 1; + } + ev->log_pos = mi->master_log_pos; + switch (ev->get_type_code()) + { + case ROTATE_EVENT: + if (process_io_rotate(mi,(Rotate_log_event*)ev)) + { + delete ev; + return 1; + } + inc_pos = 0; + break; + case LOAD_EVENT: + // TODO: actually process it + mi->master_log_pos += event_len; + return 0; + break; + default: + break; + } + if (mi->rli.relay_log.append(ev)) + { + delete ev; + return 1; + } + delete ev; + if (inc_pos) + mi->master_log_pos += event_len; + return 0; +} + int queue_event(MASTER_INFO* mi,const char* buf,uint event_len) { int error; bool inc_pos = 1; if (mi->old_format) - return 1; // TODO: deal with old format - + return queue_old_event(mi,buf,event_len); + // TODO: figure out if other events in addition to Rotate + // require special processing switch (buf[EVENT_TYPE_OFFSET]) { case ROTATE_EVENT: { Rotate_log_event rev(buf,event_len,0); - if (!rev.is_valid()) + if (process_io_rotate(mi,&rev)) return 1; - DBUG_ASSERT(rev.ident_len<sizeof(mi->master_log_name)); - memcpy(mi->master_log_name,rev.new_log_ident, - rev.ident_len); - mi->master_log_name[rev.ident_len] = 0; - mi->master_log_pos = rev.pos; - inc_pos = 0; -#ifndef DBUG_OFF - /* if we do not do this, we will be getting the first - rotate event forever, so - we need to not disconnect after one - */ - if (disconnect_slave_event_count) - events_till_disconnect++; -#endif + inc_pos=0; break; } default: |