summaryrefslogtreecommitdiff
path: root/sql/slave.cc
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2002-01-24 22:49:47 -0700
committerunknown <sasha@mysql.sashanet.com>2002-01-24 22:49:47 -0700
commitde172721edc0d619f12ea9769373fa0d7fcfbeb5 (patch)
treedbd006cf3d35d4daf9ae21af895de3a3261faf0b /sql/slave.cc
parent1c2802931e0ac2c328d5a0caa8955e774048bbb3 (diff)
downloadmariadb-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.cc89
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: