函数调用
mysql_binlog_send->(void) RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags))->
repl_semi_binlog_dump_end
代码分析
int repl_semi_binlog_dump_end(Binlog_transmit_param *param)
{
//至少有一个slave开启了半同步
bool semi_sync_slave= repl_semisync.is_semi_sync_slave();
if (semi_sync_slave)
{
/* One less semi-sync slave */
repl_semisync.remove_slave();
}
return 0;
}
void ReplSemiSyncMaster::remove_slave()
{
//锁内减一
lock();
rpl_semi_sync_master_clients--;
/* master开启着半同步,并且半同步复制状态正常 */
if (getMasterEnabled() && is_on())
{
//如果(不需要再开启半同步 或者server down掉)&&没有master事务正处于等待,则将半同步关闭
if (rpl_semi_sync_master_clients == 0 &&
(!rpl_semi_sync_mast