想问下源码中几个memtable的作用

oceanbase-CE 4.2.0.0
在阅读冻结转储源码时, 看到冻结还分 normal data 和 tx data ,
我理解normal data的一条记录是包含 tx_id 的, 然后事务的状态、 commit version 啥的记录在 tx data 中?

再又看到 MEMTABLE 还分 TX_DATA_MEMTABLE 、TX_CTX_MEMTABLE, 不太理解这两的作用?
希望大佬解答下, 谢谢

PS: 4.2版本又多了个 mds_table ,这是啥啊 没有找到相关介绍

memtable很好理解,就是用来存储用户数据的,里面的数据是MVCCRow,每一个Row里面是MVCCTransNode,node是通过事务写入的,里面是用户数据的一个版本,最开始状态是init,然后随着分布式事务状态的推进,经历on_redo, before_prepare, on_prepare, on_commit,最终提交,并写下一个提交版本号,此后,该Node便可以作为数据的多版本之一被读取的sql读到(取决于版本号顺序里,保证外部一致性)。

但是为了解决大事务与长事务的问题,OB引入了转储未提交事务的概念,因此一个TransNode可以在没有on_redo之后的任何一个状态下被转储下去,但这样的话,就失去了和事务的关联,后续如果读sql读到这个node,需要得知关联事务的状态,而TX_DATA_MEMTABLE变记录了那些事务的状态,来帮助判断读sql能否读取一个状态未觉的trans node(但实际关联事务的状态可能已决)。

TX_CTX_MEMTABLE称为事务上下文表,是用来转储事务上下文状态的,以便在宕机重启时,事务状态可以不从0开始回放,节省恢复时间。

mds_table是4.0中为内部的定制事务需求引入的新的抽象结构,称为“多源数据表”,与memtable相对应,memtable存储用户数据,mdstable存储“元数据”,元数据是内部流程所需的,例如tablet的状态等,也需要事务语义的原子性和多版本。

我大概理解下, 您是指触发一轮转储时, 会将memtable中还未提交的事务结点 记录在TX_DATA_MEMTABLE中单独处理?


是图上这一块的处理么?

TX_CTX_MEMTABLE 是怎么在宕机时候保存事务最新状态的? 不是在内存中么 是每次事务状态变更就会落盘一次?

TX_CTX_MEMTABLE不保证最新,保存了各个事务的状态信息,周期性落盘,或者如果事务过大也会触发落盘动作,落盘的意义在于1.释放内存,2. 允许CLOG回收日志。因为在极端情况下,一个超大型的事务执行所需的内存可能超过一个租户所拥有的全部内存总和,此时转储事务状态后,相关内存即可释放。这是OB自3.x之后所支持的“转储未提交”功能的一部分。