collection对应于某个pg,里面有OnodeSpace结构的onode_map变量。OnodeSpace结构的变量内又有Cache结构的cache指针变量和unordered_map的onode_map变量,这个onode_map变量是用来存放这个collection里面所有onode的extent map的元数据信息的,是一个无排序的map;Cache结构的cache指针变量有两种模式,一种是lru一种是2q,onode是以lru模式来管理的。
缓存链表和onode_map的联系上,缓存链表中记录的onode与onode_map中记录的onode 在数量和内容上都是相同的,顺序可能不同。换句话说,如果onode_map里保存了10个onode,那么缓存链表里也保存了10个相同的onode,只是这两个结构保存的顺序可能不同。
缓存链表管理中,以lru链表为例。会定时调用trim,作用是如果链表内元素数超过了指定的最大值,便不断把链表尾部的元素删除,直到链表内元素数小于指定的最大值。与此同时也会删除onode_map中相应的元素,即保证onode_map内元素的内容和链表中的一致,从而达到间接的缓存管理。
这里不清楚为什么onode_map不和lru链表合并起来,合并起来可以减少内存开销。
关于元数据缓存刷写的处理,创建TransContext结构,在调用_txc_add_transaction的过程中创建或者从缓存获取或者从硬盘读出onode结构,之后完成指定op code的操作后,做write_onode的操作,write_onode则是把onode结构放入txc里的onodes结构。之后在调用_txc_write_nodes中,对txc->onodes里的onode做update等处理,从而把数据刷到盘上。所以onode结构在onode_map和txc是分开存放的,不存在onode_map删除后txc无法找到数据从而影响刷入硬盘。
所有的onode都会刷到磁盘上的,不过会有一个onode_map这个cache来保存部分的onode,这样为后面的读写操作提供了一定的便利,因为是放在缓存中不需要从硬盘中读取。onode所保存的主要内容是extent_map。
shards是extent_map数量太多了达到某个阈值后对extent_map做的分片。分片出来的shards会保存进硬盘,onode里面的值也会保存进硬盘,两者没有冲突。如果读取的话,onode从硬盘读取后会有一部分的extent_map数据,如果在使用过程中没有找到相应的extent_map,则继续会从硬盘中读取出offset所在shards。