Vivian
2018-06-12
来源 :
阅读 2011
评论 0
摘要:本文主要向大家介绍了MySQL半同步before_send_event实例,通过具体的代码向大家展示,希望对大家学习MySQL有所帮助。
本文主要向大家介绍了MySQL半同步before_send_event实例,通过具体的代码向大家展示,希望对大家学习MySQL有所帮助。
mysql_binlog_send-->before_send_event --> repl_semi_before_send_event
--> repl_semisync.updateSyncHeader
int repl_semi_before_send_event(Binlog_transmit_param *param,
unsigned char *packet, unsigned long len,
const char *log_file, my_off_t log_pos)
{
return repl_semisync.updateSyncHeader(packet,
log_file,
log_pos,
param->server_id);
}
int ReplSemiSyncMaster::updateSyncHeader(unsigned char *packet,
const char *log_file_name,
my_off_t log_file_pos,
uint32 server_id)
{
const char *kWho = "ReplSemiSyncMaster::updateSyncHeader";
int cmp = 0;
bool sync = false;
/*
1、如果master没有开启半同步或者slave没有开启半同步,直接返回
*/
if (!getMasterEnabled() || !is_semi_sync_slave())
return 0;
function_enter(kWho);
/*
2、LOCK_binlog_锁内,下面代码串行,再次判断master是否开启半同步并且半同步是否正常
*/
lock();
/* This is the real check inside the mutex. */
if (!getMasterEnabled())
goto l_end; // sync= false at this point in time
if (is_on())
{
/*
1、当前的event的Log_file_name和pos小于reply值,表示这个event已经收到ack了,不需要再等
*/
if (reply_file_name_inited_)
{
cmp = ActiveTranx::compare(log_file_name, log_file_pos,
reply_file_name_, reply_file_pos_);
if (cmp <= 0)
{
/* If we have already got the reply for the event, then we do
* not need to sync the transaction again.
*/
goto l_end;
}
}
/*
2、如果当前event的位置大于最小等待事务ack的位置,说明这个event可能也需要等待ack
*/
if (wait_file_name_inited_)
{
cmp = ActiveTranx::compare(log_file_name, log_file_pos,
wait_file_name_, wait_file_pos_);
}
else
{
cmp = 1;
}
/*
2.1 只有cmp>=0时,才需要进行判断该event是不是事务的最后一个event。只有事务的最后一个event
才需要等待接收ACK
*/
if (cmp >= 0)
{
/*
注:active_tranxs_管理的是事务的最后一个event。通过当前event的位置hash到active_tranxs节点中
entry->hash_next_管理的是同一个hash key的事务的最后一个event,所以需要这个链表进行遍历
*/
assert(active_tranxs_ != NULL);
sync = active_tranxs_->is_tranx_end_pos(log_file_name,
log_file_pos);
}
}
/*
3、半同步发生异常,变成异步了:当前event已经是当前最新的binlog位置,表示slave已经跟上master?
这个event需要等待ACK
*/
else
{
if (commit_file_name_inited_)
{
int cmp = ActiveTranx::compare(log_file_name, log_file_pos,
commit_file_name_, commit_file_pos_);
sync = (cmp >= 0);
}
else
{
sync = true;
}
}
l_end:
unlock();
/*
4、设置包头,添加semi-sync的flag,表示需要进行等待ACK,即slave也需要回复ack
*/
if (sync)
{
(packet)[2] = kPacketFlagSync;
}
return function_exit(kWho, 0);
}
以上就介绍了MySQL的相关知识,希望对MySQL有兴趣的朋友有所帮助。了解更多内容,请关注职坐标数据库MySQL频道!
喜欢 | 0
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号