美文网首页MySQL
二十:从库MTS多线程并行回放(二)(笔记)

二十:从库MTS多线程并行回放(二)(笔记)

作者: 重庆八怪 | 来源:发表于2019-06-30 14:18 被阅读10次

    一、工作线程执行Event

    外部循环
    slave_worker_exec_job_group
      ->pop_jobs_item 出队 获取event 但是不删除
        如果队列为空则等待
        stage_slave_waiting_event_from_coordinator
        Waiting for an event from Coordinator
      ->进入循环
         
        如果是GTID EVENT 标记事物开始
        记录读取event时间
        Slave_worker::slave_worker_exec_event 执行event
        -> 如果是XID
            Xid_apply_log_event::do_apply_event_worker    
            
            -> Slave_worker::commit_positions
               -> 设置各种变量 将会出现在worker info里面 这里也可以看到这些信息是group的checkpoint信息
                      
                      当前执行的位置:
                      strmake(group_relay_log_name, ptr_g->group_relay_log_name,sizeof(group_relay_log_name) - 1);
                      group_relay_log_pos= ev->future_event_relay_log_pos;
                      set_group_master_log_pos(ev->common_header->log_pos);
                      set_group_master_log_name(c_rli->get_group_master_log_name());
                      
                      检查信息:
                      strmake(checkpoint_relay_log_name, ptr_g->checkpoint_relay_log_name,sizeof(checkpoint_relay_log_name) - 1);
                      checkpoint_relay_log_pos= ptr_g->checkpoint_relay_log_pos;
                      strmake(checkpoint_master_log_name, ptr_g->checkpoint_log_name,sizeof(checkpoint_master_log_name) - 1);
                      checkpoint_master_log_pos= ptr_g->checkpoint_log_pos;
                      
                      
                      checkpoint_seqno= ptr_g->checkpoint_seqno;
                          for (uint pos= ptr_g->shifted; pos < c_rli->checkpoint_group; pos++) //重新设置位图 因为checkpoint已经 
                         {                                                                     //ptr_g->shifted是GAQ中出队的事务个数
                            if (bitmap_is_set(&group_shifted, pos))                            //这里就需要偏移掉出队的事务,恢复已经不需要了
                            bitmap_set_bit(&group_executed, pos - ptr_g->shifted);
                          }
                      bitmap_set_bit(&group_executed, ptr_g->checkpoint_seqno);//在本次事务相应的位置设置为1
                      
                 -> 进行flush_info(force)操作刷盘 将信息写入到worker info 表中
      
            -> error= do_commit(thd); //做提交操作 
    
      ->remove_item_from_jobs 在队列中删除这个event 
        
        如果是XID event 则退出循环 代表整个 事物执行完成
        
        Slave_worker::slave_worker_ends_group
         -> get_commit_order_manager()->report_commit(this);
             
         ->更新Slave_job_group信息
                ptr_g->group_master_log_pos= get_group_master_log_pos(); //更新 job group信息
                ptr_g->group_relay_log_pos= group_relay_log_pos;
                my_atomic_store32(&ptr_g->done, 1);
                last_group_done_index= gaq_index;
                last_groups_assigned_index= ptr_g->total_seqno;
                reset_gaq_index();
                groups_done++; //更新GROUP信息 这里也可以看到GROUP的信息来自work的类      
         ->
    

    相关文章

      网友评论

        本文标题:二十:从库MTS多线程并行回放(二)(笔记)

        本文链接:https://www.haomeiwen.com/subject/tbmeaqtx.html