天天看點

二十:從庫MTS多線程并行回放(二)(筆記)

一、工作線程執行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的類      
     ->           

繼續閱讀