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

一、工作線程執(zhí)行Event

外部循環(huán)
slave_worker_exec_job_group
  ->pop_jobs_item 出隊 獲取event 但是不刪除
    如果隊列為空則等待
    stage_slave_waiting_event_from_coordinator
    Waiting for an event from Coordinator
  ->進入循環(huán)
     
    如果是GTID EVENT 標記事物開始
    記錄讀取event時間
    Slave_worker::slave_worker_exec_event 執(zhí)行event
    -> 如果是XID
        Xid_apply_log_event::do_apply_event_worker    
        
        -> Slave_worker::commit_positions
           -> 設(shè)置各種變量 將會出現(xiàn)在worker info里面 這里也可以看到這些信息是group的checkpoint信息
                  
                  當(dāng)前執(zhí)行的位置:
                  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++) //重新設(shè)置位圖 因為checkpoint已經(jīng) 
                     {                                                                     //ptr_g->shifted是GAQ中出隊的事務(wù)個數(shù)
                        if (bitmap_is_set(&group_shifted, pos))                            //這里就需要偏移掉出隊的事務(wù),恢復(fù)已經(jīng)不需要了
                        bitmap_set_bit(&group_executed, pos - ptr_g->shifted);
                      }
                  bitmap_set_bit(&group_executed, ptr_g->checkpoint_seqno);//在本次事務(wù)相應(yīng)的位置設(shè)置為1
                  
             -> 進行flush_info(force)操作刷盤 將信息寫入到worker info 表中
  
        -> error= do_commit(thd); //做提交操作 

  ->remove_item_from_jobs 在隊列中刪除這個event 
    
    如果是XID event 則退出循環(huán) 代表整個 事物執(zhí)行完成
    
    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的類      
     ->
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ??一個任務(wù)通常就是一個程序,每個運行中的程序就是一個進程。當(dāng)一個程序運行時,內(nèi)部可能包含了多個順序執(zhí)行流,每個順...
    OmaiMoon閱讀 1,806評論 0 12
  • 為什么多線程? 多線程并不一定是最好的,合適才是最好的。 多線程主要的優(yōu)點是價廉物美,啟動快、退出快、與其他線程共...
    小熊猜猜我有幾顆糖閱讀 867評論 0 6
  • 一. 操作系統(tǒng)概念 操作系統(tǒng)位于底層硬件與應(yīng)用軟件之間的一層.工作方式: 向下管理硬件,向上提供接口.操作系統(tǒng)進行...
    月亮是我踢彎得閱讀 6,176評論 3 28
  • 一、多線程基礎(chǔ) 基本概念 進程進程是指在系統(tǒng)中正在運行的一個應(yīng)用程序每個進程之間是獨立的,每個進程均運行在其專用且...
    AlanGe閱讀 653評論 0 0
  • 我喜歡這夜,或許只是因為我大抵是這樣的人吧! 少時夜記 年少只知玩樂...
    壹涅閱讀 568評論 4 4

友情鏈接更多精彩內(nèi)容