MySQL半同步复制的示例分析
发布时间:2022-01-11 14:22:39 所属栏目:MySql教程 来源:互联网
导读:这篇文章主要介绍MySQL半同步复制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 代码分析 int repl_semi_report_commit(Trans_param *param)//gdb下param? { bool is_real_trans= param-flags TRANS_IS_REAL_TRANS;
这篇文章主要介绍MySQL半同步复制的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完! 代码分析 int repl_semi_report_commit(Trans_param *param)//gdb下param? { bool is_real_trans= param->flags & TRANS_IS_REAL_TRANS; if (is_real_trans && param->log_pos) { const char *binlog_name= param->log_file; return repl_semisync.commitTrx(binlog_name, param->log_pos); } return 0; } <ol start="1" class="dp-cpp" white-space:normal;margin:0px 0px 1px 45px !important;"> int ReplSemiSyncMaster::commitTrx(const char* trx_wait_binlog_name, my_off_t trx_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_cond THD_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()) goto l_end; //计算等待ACK的截止时间。按照当前时间加上半同步等待的超时时间,这个时间回在发起信号量等待的时候用的 //rpl_semi_sync_master_timeout abstime.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_end int cmp = 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<0,表示调整当前最小需要等待 //binlog的位置。rpl_semi_sync_master_wait_pos_backtraverse++,即等待位置需要调整的次数,一般不会 //调整 int cmp = ActiveTranx::compare(trx_wait_binlog_name, trx_wait_binlog_pos, wait_file_name_, wait_file_pos_); if (cmp <= 0){ strncpy(wait_file_name_, trx_wait_binlog_name, sizeof(wait_file_name_) - 1); wait_file_name_[sizeof(wait_file_name_) - 1]= ' |