openGauss源码解析(66)

openGauss源码解析:存储引擎源码解析(34)

2. 详细流程

(1) 一旦触发了检查点,Checkpointer后台会触发MOT的CREATE_SNAPSHOT事件。
(2) 当检查点处于REST阶段时,CheckpointManager将等待在COMPLETE阶段启动的事务完成。
(3) CheckpointManager修改checkpoint阶段为PREPARE。如果没有在REST阶段启动提交的事务处于活动状态,则立即进入RESOLVE阶段,否则等待REST阶段启动提交的最后一个事务完成后进入RESOLVE阶段。
(4) RESOLVE阶段标记了虚拟一致性点。在此阶段不允许任何事务开始提交,以避免在openGauss采取检查点的重做点之前这些事务写入重做日志。CheckpointManager等待在PREPARE阶段启动的事务完成。
(5) CheckpointManager准备要flush的表的列表(任务列表)并读取这些表的锁状态。
(6) 然后获取写锁,锁定redolog handler,并将检查点阶段更改为CAPTURE。这标志着CREATE_SNAPSHOT事件结束。
(7) openGaussCheckpointer获取WalInsertLock锁并计算此检查点的重做点。然后,该重做点触发MOT的SNAPSHOT_READY事件。
(8) CheckpointManager存储重做点,释放redolog handler锁。这标志着SNAPSHOT_READY事件结束。
(9) 然后openGaussCheckpointer释放WalInsertLock并将所有磁盘引擎脏页刷盘,即磁盘引擎的检查点。
(10) 然后触发MOT的BEGIN_CHECKPOINT事件。
(11) CheckpointManager在这个阶段生成检查点worker来完成MOT检查点任务列表。
(12) 检查点worker之间共享任务列表,并将所有符合条件的行刷入磁盘(行的稳定版本或没有显式稳定版本到磁盘的活动版本)。在此过程中任何显式稳定版本一旦刷新到磁盘,就会释放。
(13) 一旦所有检查点worker完成任务,CheckpointManager将解锁表并清除任务列表。
(14) CheckpointManager还可将检查点阶段提前到COMPLETE。
(15) 通过创建map文件、结束文件等来完成检查点,然后更新mot.ctrl文件。
(16) 等待CAPTURE阶段开始的事务完成。
(17) 交换可用位和不可用位,以便将他们映射到稳定状态位中的1和0值。
(18) 修改checkpoint阶段为REST。这标志着BEGIN_CHECKPOINT事件和MOT检查点的结束。
(19) 然后openGauss将检查点记录插入到XLOG中,刷新到硬盘,最后更新控制文件。openGauss中的检查点就此结束。

3. 关键类和数据结构

检查点的关键类和数据结构如表4-40所示。

表4-40 检查点的关键类和数据结构简介

关键类和数据结构

描述

CheckpointManager类

理整个检查点机制的主类,是MOT中所有检查点相关任务的接口类。CheckpointWorkerPool类用于生成检查点worker并刷盘。该类不提供真正的接口。实例化对象时会生成检查worker,并使用回调通知任务完成。在CAPTURE阶段CheckpointManager实例化一个CheckpointWorkerPool对象,并等待所有任务完成。CheckpointControlFile用于实现checkpoint控制文件逻辑。MOT控制文件保存着最后一个有效检查点ID、lsn(openGauss中的重做点)和最后一个重放lsn。控制文件mot.ctrl在每个检查点结束时更新

CheckpointWorkerPool类

用于生成检查点worker并刷盘

posted @ 2024-04-29 16:53  openGauss-bot  阅读(10)  评论(0编辑  收藏  举报