知识卡片
事务用索引复用压缩重复对象引用
内容
ObjectStore 的事务有两种序列化方式:一种直接把所有操作数据整体塞进一个 bufferlist(tbl);另一种把操作结构体和数据分开存放,操作里不直接保存完整的 collection/对象标识,而是保存一个整数 id,另外单独维护 coll_t→coll_id、ghobject_t→object_id 的映射表。第二种方式的意义在于:一个事务里经常有多个操作针对同一个对象(比如先创建再写数据再改属性),如果每个操作都完整复制一遍对象标识符,会有大量重复数据;用映射表 + 索引后,同一个对象无论被引用多少次都只需要存一份完整标识,其余地方只存一个小整数。这是典型的”用一次性建立的字典替换重复出现的大对象”压缩思路。
参考来源
《Ceph源码分析》第7章《本地对象存储》