【标题】(请简要描述下实现的内容)
【回合5.0.0】修改txn redo线程确认redo work线程确认lsn的方式
【实现内容】:
【回合5.0.0】修改txn redo线程确认redo work线程确认lsn的方式
【根因分析】:
通过gdb发现,startup线程一直阻塞在等待记录05/20A348的回放完成中。而该记录已由其中一个page redo线程(worker1)回放完成,由于该记录属于hash索引的VACUUM记录,回放后需要确保startup线程也回放到此处,因此也在等待中。所以两个线程互相阻塞。
输入图片说明
输入图片说明
而startup线程阻塞的原因,是由于page redo线程(worker3)的还未完成任何一个日志的回放,其lastReplayedEndRecPtr仍然为0,进而导致startup调用GetReplayedRecPtrFromWorkers获取所有worker中最小lastReplayedEndRecPtr时(下面代码中的lrEnd)结果恒为0。因此跳不出循环。
输入图片说明
输入图片说明
而worker0、worker2、worker3刚好也在等待一个记录被worker1回放,因此几个线程都卡在循环中,导致并行回放无法结束。
输入图片说明
【实现方案】:
回合master的两个pr:!4225:修改txn redo线程确认redo work线程确认lsn的方式 !4230:GetReplyingRecPtr()函数内同时考虑curReplayingReadRecPtr和lastReplayedEndRecPtr,修改startup线程确认redo work线程回放lsn位置的流程,记录page redo线程正在回放的位置,startup线程判断目标记录是否已回放时考虑该位置。上述问题中worker3为0的lastReplayedEndRecPtr就不会有影响,因为正在回放的位置是最新的。
【关联需求或issue】:
#I87OYH:【测试类型:SQL功能】【测试版本:5.0.1】【自动化】 备机偶现启动失败,om查询其状态一直为starting
【开发自验报告】:

  1. 请附上自验结果(内容或者截图)
    修改用重启有问题的数据库成功。
    输入图片说明
  2. 是否可以添加fastcheck测试用例,如是,请补充fastcheck用例
    偶现问题,无法添加用例
  3. 是否涉及资料修改,如是,在docs仓库补充资料
    不涉及
  4. 是否考虑升级场景(系统表修改、日志持久化以及修改执行态数据格式)
    不涉及
  5. 是否考虑在线扩容等扩展场景
    不涉及
  6. 是否考虑异常场景/并发场景/前向兼容/性能场景
    不涉及
  7. 是否对其他模块产生影响
    不涉及
    【其他说明】: