重做日志的关键类和数据结构如表4-39所示。
表4-39 重做日志的关键类和数据结构简介
| 关键类和数据结构 | 描述 |
| RedoLog类 | 负责事务数据序列化的主要类,它是TxnManager类的成员对象。RedoLog的commit方法由TxnManager在事务通过验证阶段并且所有更新的行均已锁定后在提交协议中调用。在将变更应用到存储之前,RedoLog将在加锁后序列化事务数据,持久化到日志,释放锁。RedoLog使用RedoLogHandler将数据写入日志。RedoLogBuffer类是序列化缓冲区的一个简单实现,RedoLog类通过RedoLogBuffer序列化事务操作。RedoLogBuffer的前4个字节预留给缓冲区大小,在序列化时写入。OperationCode枚举是支持的事务操作列表。RecoveryManager通过根据OperationCode确定如何解析数据并应用事务操作 |
| RedoLogWriter | 用于将操作序列化到缓冲区中。RedoLogWriter是一个简单的helper类,获取数据和缓冲区,并将数据序列化到缓冲区中 |
| EndSegmentBlock | 控制块,写在每个flushed缓冲区的末尾。包括事务、CSN、是否提交等信息 |
| EndSegmentBlockSerializer | 一个简单的helper类,用于序列化和反序列化EndSegmentBlock |
| Ilogger接口 | 写日志接口的抽象。MOT通过ILogger可以写入不同类型的日志 |
| LoggerFactory | 一个工厂类,用于创建不同类型的ILogger。LoggerFactory通过MOT配置项确定要创建哪种logger |
| XLOGLogger | 基于openGauss XLOG (WAL)的ILogger的一个实现,它简单地使用openGauss WAL接口将序列化的事务写入WAL中。MOT WAL日志项有自己的资源管理器,这可以使openGauss识别到该日志项是一个MOT WAL日志项,并将其转发到MOT处理。AddToLog为XLOGLogger子接口,XLOGLogger使用openGauss日志基础能力。因此,AddToLog是一个对openGauss XLOG接口的简单委托 |
图4-69所示代码为XLOGLogger::AddToLog接口的实际实现。

图4-69 XLOGger对openGauss XLOG的委托
RedoLogHandler是重做日志逻辑的抽象。RedoLogHandler的派生类可实现不同的日志方法。RedoLogHandler是一个单例模式,由MOT管理,为RedoLog所用。
RedoLogHandlerFactory用于创建RedoLogHandler。MOT根据配置项中配置的RedoLogHandlerType创建RedoLogHandler。
SynchronousRedoLogHandler简单地将RedoLogBuffers委托给ILogger,以便写入重做日志。请参阅前述的同步日志记录小节。
GroupSyncRedoLogHandler是最先进的无锁组提交RedoLogHandler。GroupSyncRedoLogHandler将几个事务的redo log缓冲区分组到一个组,并把他们写在一起,以便优化和最小化磁盘IO。请参阅前述同步组提交小节。CommitGroup表示将一组RedoLogBuffer一起记录。一个提交组有一个主线程,由该主线程创建该提交组,它负责将组内的所有RedoLogBuffer写入日志。主线程写日志时,所有其他线程都在等待。主线程完成写入后将发送信号来唤醒组内其他所有线程,一旦唤醒,事务就可以继续。SegmentedGroupSyncRedoLogHandler是配置了GroupCommit日志方法时的RedoLogHandler。它是RedoLogHandler的一个实现,每个socket都有GroupSyncRedoLogHandler。SegmentedGroupSyncRedoLogHandler的优点在于可以通过维护多个组提交处理程序实现更高的并发。SegmentedGroupSyncRedoLogHandler维护一个GroupSyncRedoLogHandler数组,并将线程绑定到Socket以将线程委托给正确的处理程序。




