注意
本文档适用于 Ceph 开发版本。
公共OSD版本
我们在磁盘上维护两个版本:一个eversion_t pg_log.head和一个version_t info.user_version。每个对象都被标记上它最后被修改时的pg版本和用户版本。PG版本通过操作OpContext::at_version进行修改,然后将其作为事务持久化到pg日志中,并在所有它曾经使用的地方进行递增。用户版本通过操作新的OpContext::user_at_version进行修改,并且也通过pg日志事务进行持久化。
这组更新语义意味着对于传统池,用户版本将等于过去的reassert_version,而对于缓存池,对象和PG用户版本将能够在池之间交叉而不使事情变得一团糟。
对于新客户端,我们阻止他们读取bad_replay_version,并添加两个正确的成员:user_version和replay_version;user_version在每次操作(包括读取)中填充,而replay_version在写入时填充。
对象类函数get_current_version()现在始终返回pg->info.last_user_version,这意味着它保证包含PG中最后一次用户更新的版本(包括在读取时!)。
由 Ceph 基金会带给您
Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.