二十:从库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的类      
     ->
相关文章
|
4天前
|
存储 设计模式 分布式计算
Java中的多线程编程:并发与并行的深度解析####
在当今软件开发领域,多线程编程已成为提升应用性能、响应速度及资源利用率的关键手段之一。本文将深入探讨Java平台上的多线程机制,从基础概念到高级应用,全面解析并发与并行编程的核心理念、实现方式及其在实际项目中的应用策略。不同于常规摘要的简洁概述,本文旨在通过详尽的技术剖析,为读者构建一个系统化的多线程知识框架,辅以生动实例,让抽象概念具体化,复杂问题简单化。 ####
|
1月前
|
并行计算 安全 Java
Python 多线程并行执行详解
Python 多线程并行执行详解
60 3
|
2月前
|
设计模式 缓存 Java
谷粒商城笔记+踩坑(14)——异步和线程池
初始化线程的4种方式、线程池详解、异步编排 CompletableFuture
谷粒商城笔记+踩坑(14)——异步和线程池
|
3月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
2月前
|
SQL 存储 监控
SQLServer事务复制延迟优化之并行(多线程)复制
【9月更文挑战第12天】在SQL Server中,事务复制延迟会影响数据同步性。并行复制可通过多线程处理优化这一问题,提高复制效率。主要优化方法包括:配置分发代理参数、优化网络带宽、调整系统资源、优化数据库设计及定期监控维护。合理实施这些措施可提升数据同步的及时性和可靠性。
|
3月前
|
安全 Java
Java模拟生产者-消费者问题。生产者不断的往仓库中存放产品,消费者从仓库中消费产品。其中生产者和消费者都可以有若干个。在这里,生产者是一个线程,消费者是一个线程。仓库容量有限,只有库满时生产者不能存
该博客文章通过Java代码示例演示了生产者-消费者问题,其中生产者在仓库未满时生产产品,消费者在仓库有产品时消费产品,通过同步机制确保多线程环境下的线程安全和有效通信。
|
3月前
|
数据采集 存储 监控
如何使用pholcus库进行多线程网页标题抓取以提高效率?
如何使用pholcus库进行多线程网页标题抓取以提高效率?
|
3月前
|
算法 Java
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决
JDK版本特性问题之想控制 G1 垃圾回收器的并行工作线程数量,如何解决
|
4月前
|
SQL 安全
线程操纵术并行策略问题之调整并行流的并行度问题如何解决
线程操纵术并行策略问题之调整并行流的并行度问题如何解决
|
4月前
|
安全
线程操纵术并行策略问题之ForkJoinTask提交任务的问题如何解决
线程操纵术并行策略问题之ForkJoinTask提交任务的问题如何解决