ceph中LogSegment类有什么用
这篇文章主要为大家展示了“ceph中LogSegment类有什么用”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“ceph中LogSegment类有什么用”这篇文章吧。
LogSegment类说明:
class LogSegment {
const log_segment_seq_t seq; 记录LogSegment序号
uint64_t offset, end; 记录偏移位置和结束位置
int num_events; 记录event的数量
elist<CDir*> dirty_dirfrags, new_dirfrags; 记录有变化的CDir结构
elist<CDentry*> dirty_dentries; 记录有变化的CDentry结构
elist<CInode*> dirty_inodes; 记录有变化的CInode
elist<CInode*> dirty_parent_inodes, dirty_dirfrag_dir, dirty_dirfrag_nest, dirty_dirfrag_dirfragtree
elist<CInode*> open_files;
...
};
LogSegment用来记录实际变化的CDir/CDentry/CInode的信息,LogSegment是整个MDLog最底层的数据结构
LogSegment类的方法:
LogSegment::try_to_expire(mds, gather_bld, op_prio)
|__遍历new_dirfrags/dirty_dirfrags数组
|__将数组中的内容插入到commit数组
|__遍历dirty_dentries数组
|__将数组中成员的CDentry::get_dir()插入到commit数组
|__遍历dirty_inodes数组
|__将数组中成员的CInode::get_parent_dn()::get_dir()插入到commit数组
|__遍历commit数组
|__若commit数组成员can_auth_pin()
|__CDir::commit() 提交针对CDir的修改
|__若commit数组成员!can_auth_pin()
|__CDir::add_waiter(CDir::WAIT_UNFREEZE) 添加到等待队列中
|__遍历uncommitted_masters数组
|__mds->mdcache->wait_for_uncommitted_master() 等待客户端回复commit
|__遍历uncommitted_fragments数组
|__mds->mdcache->wait_for_uncommitted_fragment() 等待未收到commit的fragment
|__遍历dirty_dirfrag_dir数组
|__mds->locker->scatter_nudge() 等待dirlock flush
|__遍历dirty_dirfrag_dirfragtree数组
|__mds->locker->scatter_nudge() 等待dirfragtreelock flush
|__遍历dirty_dirfrag_nest数组
|__mds->locker->scatter_nudge() 等待nest flush
|__遍历open_files数组
|__数组中的CInode是授权的并且有访问权限的
|__若LogEvent为空
|__创建一个新的EOpen类对象
|__mds->mdlog->start_entry(EOpen) 将新的EOpen类对象写入到mdlog
|__le->add_clean_inode() 将inode添加到LogEvent的clean inode数组中
|__ls->open_files.push_back() 插入到LogSegment的open_files数组
|__数组中的CInode是授权的但没有访问权限
|__in->item_open_file.remove_myself() 从item_open_file数组中删除此CInode
|__若le不为空
|__mds->mdlog->submit_entry(le) 提交LogEvent到MDLog中
|__遍历dirty_parent_inodes数组
|__若数组中元素can_auth_pin()
|__CInode::store_backtrace()
|__若数组中元素不能can_auth_pin()
|__CInode::add_waiter(CInode::WAIT_UNFREEZE) 等待unfreeze
|__遍历slave_updates数组
|__更新MDSlaveUpdate::waiter = gather_bld.new_sub() 等待slave update
|__检查inotablev是否大于mds->inotable->get_committed_version()
|__mds->inotable->save() 保存inotable
|__检查sessionmapv是否大于mds->sessionmap.get_committed()
|__mds->sessionmap.save() 保存sessionmap
|__mds->sessionmap.save_if_dirty() 保存sessionmap
|__遍历pending_commit_tids数组
|__从数组中得到MDSTableClient类对象
|__MDSTableClient::wait_for_ack() 等待未应答的commit
|__遍历tablev数组
|__从数组中得到MDSTableServer类对象
|__若tablev数组中的version值大于MDSTableServer::get_committed_version()
|__MDSTableServer::save() 保存MDSTableServer
|__遍历truncating_inodes数组
|__CInode::add_waiter(CInode::WAIT_TRUNC) 等待TRUNC
|__mds->mdlog->flush() 刷新mdlog
以上是“ceph中LogSegment类有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!