这篇文章主要介绍MySQL半同步复制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
代码分析
intrepl_semi_report_commit(Trans_param*param)//gdb下param?{boolis_real_trans=param->flags&TRANS_IS_REAL_TRANS;if(is_real_trans&¶m->log_pos){constchar*binlog_name=param->log_file;returnrepl_semisync.commitTrx(binlog_name,param->log_pos);}return0;}intReplSemiSyncMaster::commitTrx(constchar*trx_wait_binlog_name,my_off_ttrx_wait_binlog_pos){//自旋锁,下面的代码是线性执行。mysql_mutex_lock(&LOCK_binlog_);if(active_tranxs_!=NULL&&trx_wait_binlog_name){entry=active_tranxs_->find_active_tranx_node(trx_wait_binlog_name,trx_wait_binlog_pos);if(entry)thd_cond=&entry->cond;}//进入信号了,为后面发起信号量的等待动作做准备,每个正在进行提交的事务都对应一个初始化的信号量thd_condTHD_ENTER_COND(NULL,thd_cond,&LOCK_binlog_,&stage_waiting_for_semi_sync_ack_from_slave,&old_stage);if(getMasterEnabled()&&trx_wait_binlog_name){set_timespec(start_ts,0);//if(!getMasterEnabled()||!is_on())gotol_end;//计算等待ACK的截止时间。按照当前时间加上半同步等待的超时时间,这个时间回在发起信号量等待的时候用的//rpl_semi_sync_master_timeoutabstime.tv_sec=start_ts.tv_sec+wait_timeout_/TIME_THOUSAND;abstime.tv_nsec=start_ts.tv_nsec+(wait_timeout_%TIME_THOUSAND)*TIME_MILLION;if(abstime.tv_nsec>=TIME_BILLION){abstime.tv_sec++;abstime.tv_nsec-=TIME_BILLION;}//state_是TRUE表示当前半同步状态为on,否则直接进入l_end。Rpl_semi_sync_master_status//reply_file_name_值的变化,在其他函数中?while(is_on()){if(reply_file_name_inited_){//比较事务所涉及的binlog位置跟reply的位置,免费主机域名如果cmp>0,说明此事务的binlog已经同步//到slave,跳出该循环,进入最后阶段l_endintcmp=ActiveTranx::compare(reply_file_name_,reply_file_pos_,trx_wait_binlog_name,trx_wait_binlog_pos);if(cmp>=0){break;}}if(wait_file_name_inited_){//比较事务所涉及的binlog位置和当前最小需要等待的binlog位置。如果cmp//binlog的位置。rpl_semi_sync_master_wait_pos_backtraverse++,即等待位置需要调整的次数,一般不会//调整intcmp=ActiveTranx::compare(trx_wait_binlog_name,trx_wait_binlog_pos,wait_file_name_,wait_file_pos_);if(cmpstrncpy(wait_file_name_,trx_wait_binlog_name,sizeof(wait_file_name_)-1);wait_file_name_[sizeof(wait_file_name_)-1]=’
文章页正文上