sync_relay_log 肯定是与relay log相关,所以从rpl_slave.cc处理relay log的代码开始入手
extern "C" void *handle_slave_io(void *arg)
/* XXX: 'synced' should be updated by queue_event to indicate
whether event has been synced to disk */
bool synced= 0;
if (queue_event(mi, event_buf, event_len)) --写event到relay log
{
mi->report(ERROR_LEVEL, ER_SLAVE_RELAY_LOG_WRITE_FAILURE,
ER(ER_SLAVE_RELAY_LOG_WRITE_FAILURE),
"could not queue event from master");
goto err;
}
if (RUN_HOOK(binlog_relay_io, after_queue_event, -- 写成功后的调用,在这个文件中定义的调用方法semisync_slave_plugin.cc
(thd, mi, event_buf, event_len, synced)))
{
mi->report(ERROR_LEVEL, ER_SLAVE_FATAL_ERROR,
ER(ER_SLAVE_FATAL_ERROR),
"Failed to run 'after_queue_event' hook");
goto err;
}
先看下queue_event
bool queue_event(Master_info* mi,const char* buf, ulong event_len)
....处理了很多的类型
bool is_error= false;
/* write the event to the relay log */
if (likely(rli->relay_log.append_buffer(buf, event_len, mi) == 0))
{
mi->set_master_log_pos(mi->get_master_log_pos() + inc_pos);
DBUG_PRINT("info", ("master_log_pos: %lu", (ulong) mi->get_master_log_pos()));
rli->relay_log.harvest_bytes_written(rli, true/*need_log_space_lock=true*/);
继续看下append_buffer ,这个函数在binlog.cc这个文件,不是sql_binlog.cc
bool MYSQL_BIN_LOG::append_buffer(const char* buf, uint len, Master_info *mi)
{
DBUG_ENTER("MYSQL_BIN_LOG::append_buffer");
// check preconditions
assert(log_file.type == SEQ_READ_APPEND);
assert(is_relay_log);
mysql_mutex_assert_owner(&LOCK_log);
// write data
bool error= false;
if (my_b_append(&log_file,(uchar*) buf,len) == 0)
{
bytes_written += len;
error= after_append_to_relay_log(mi);
}
else
error= true;
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交