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

简介: 一、工作线程执行Event外部循环slave_worker_exec_job_group ->pop_jobs_item 出队 获取event 但是不删除 如果队列为空则等待 stage_slave_waiting_event_from_coordinator Wa...

一、工作线程执行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的类      
     ->
相关文章
|
1月前
|
并行计算 安全 程序员
【C++】—— C++11之线程库
【C++】—— C++11之线程库
|
1月前
|
Java 调度 Python
深入解析 Python asyncio 库:如何使用线程池实现高效异步编程
深入解析 Python asyncio 库:如何使用线程池实现高效异步编程
55 0
|
5月前
|
机器学习/深度学习 缓存 Java
Python 线程,进程,多线程,多进程以及并行执行for循环笔记
Python 线程,进程,多线程,多进程以及并行执行for循环笔记
430 0
Python 线程,进程,多线程,多进程以及并行执行for循环笔记
|
6月前
|
并行计算 安全 Java
深入理解Java并发编程:并行与并发、进程与线程、优先级、休眠与让步
深入理解Java并发编程:并行与并发、进程与线程、优先级、休眠与让步
257 0
|
5月前
|
编译器 Linux 调度
|
1月前
|
缓存 编译器 程序员
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
C/C++编译器并行优化技术:并行优化针对多核处理器和多线程环境进行优化,以提高程序的并行度
62 0
|
1月前
|
Python
在Python中,如何使用多线程或多进程来实现任务的并行执行?
在Python中,如何使用多线程或多进程来实现任务的并行执行?
145 1
|
8月前
|
架构师
架构系列——架构师必备基础:并发、并行与多线程关系
架构系列——架构师必备基础:并发、并行与多线程关系
|
8月前
|
并行计算 调度
多线程的并发和并行
多线程的并发和并行
67 0

热门文章

最新文章