小编给大家分享一下ScrubStack类有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
ScrubStack类用于临时保存待进行Scrub的文件或目录,对于目录来说,最终调用dir->scrub_initialize()函数执行实际的scrub操作;对于文件来说,最终调用inode->validate_disk_state()函数执行实际的scrub操作。
ScrubStack类说明:
class ScrubStack {
Finisher *finisher; finisher用于处理Scrub完成后的回调处理
elist<CInode*> inode_stack; 等待Scrub的Inode栈
int scrubs_in_progress; 目前正在处于scrub的数量
int stack_size; 记录stack的大小
MDCache *mdcache; MDS Cache指针
C_KickOffScrubs scrub_kick; 启动scrub的类对象
};
ScrubStack类方法:
ScrubStack::push_inode(in)
|__检查in的item_scrub是否不在inode_stack列表上,即:in->item_scrub.is_on_list()
|__设置in的PIN_SCRUBQUEUE
|__递增stack_size
|__将in的item_scrub插入到inode_stack数组的头部
ScrubStack::push_inode_bottom(in)
|__检查in的item_scrub是否不在inode_stack列表上,即:in->item_scrub.is_on_list()
|__则设置in的PIN_SCRUBQUEUE
|__递增stack_size
|__将in的item_scrub插入到inode_stack数组的尾部
ScrubStack::pop_inode(in)
|__清除in的PIN_SCRUBQUEUE
|__将in的item_scrub从inode_stack数组中删除
|__递减stack_size
ScrubStack::_enqueue_inode(in, parent, header, on_finish, top)
|__对于in执行scrub初始化的工作,即:in->scrub_initialize(parent, header, on_finish)
|__top==true
|__调用push_inode(in),将in插入到inode_stack的首部
|__top==false
|__调用push_inode_bottom(in),将in插入到inode_stack的尾部
ScrubStack::enqueue_inode(in, header, on_finish, top)
|__调用_enqueue_inode()函数,对inode进行scrub的初始化工作并且将in插入到inode_stack数组中
|__调用kick_off_scrubs()函数来执行scrub操作
ScrubStack::kick_off_scrubs()
|__从头开始遍历inode_stack数组并且配置文件中的mds_max_scrub_ops_in_progress > scurbs_in_progress
|__若待scrub的inode不是目录(普通文件/符号链接/硬链接)
|__调用pop_inode()函数从inode_stack数组中删除待scrub的inode
|__若待scrub的inode没有设置on_finish
|__递增scrubs_in_progress
|__设置finisher回调函数为scrub_tick
|__调用scrub_file_inode(curi) 执行实际的scrub操作
|__设置can_continue=true
|__若待scrub的inode是目录
|__调用scrub_dir_inode() 执行实际的scrub操作
|__若scrub操作完成
|__调用pop_inode(curi)从inode_stack数组中删除待scrub的inode
|__若scrub操作正在进行中
|__从inode_stack数组的首部取出下一个待scrub的inode
ScrubStack::scrub_dir_inode(in, added_children, terminal, done)
|__从in的scrub_info中得到header信息
|__若header的recursive==true
|__从in中得到正在进行scrub操作的dirfrags,即:in->scrub_dirfrags_scrubbing(scrubbing_frags)
|__遍历scrubbing_frags数组
|__得到dirfrag对应的CDir类对象
|__若CDir类对象不为空
|__将CDir类对象插入到scrubbing_cdirs数组中
|__若CDir类对象为空
|__完成in的dirfrag的scrub操作,即:in->scrub_dirfrag_finished(*i)
|__若配置文件中的msd_max_scrub_ops_in_progress > scrubs_in_progress
|__从scrubbing_cdirs数组中获取一个成员
|__若scrubbing_cdirs为空
|__调用get_next_cdir()函数获取下一个待scrub的目录
|__将待scrub的目录插入到scrubbing_cdirs数组中
|__调用scrub_dirfrag()执行实际的scrub操作
|__若所有的dirfrags都完成了scrub
|__调用scrub_dir_inode_final(in)
ScrubStack::get_next_cdir(in, new_dir)
|__从in中得到下一个待scrub的dirfrag,即:in->scrub_dirfrag_next(next_frag)
|__从in中得到下一个待scrub的CDir信息,即:in->get_or_open_dirfrag(mdcache, next_frag)
|__若CDir是未complete的
|__递增scrubs_in_progress
|__从集群中获取该CDir信息,即:next_dir->fetch(scrub_tick)
|__返回false
|__设置new_dir=next_dir
|__返回true
ScrubStack::scrub_dir_inode_final(in)
|__若in的scrub_info中的children_scrubbed==0
|__若in的scrub_info的on_finish==0
|__递增scrubs_in_progress
|__设置in的scrub finisher为scrub_tick
|__执行in的scrub_children_finished()
|__执行in的validate_disk_state()
ScrubStack::scrub_dirfrag(dir, header, added_children, is_terminal, done)
|__若dir的scrub_info中的directory_scrubbing==0
|__若dir未完成
|__递增scrubs_in_progress
|__从集群中获取到dir的内容,即:dir->fetch(scrub_kick)
|__直接返回
|__执行dir的scrub_initialize()函数进行scrub的初始化工作
|__执行dir的scrub_dentry_next()函数获取到下一个待scrub的dentry,即:dir->scrub_dentry_next()
|__调用_enquue_inode()将待scrub的dentry插入到待scrub的队列中
ScrubStack::scrub_file_inode(in)
|__执行in的validate_disk_state()
ScrubStack::_validate_inode_done(in, r, result)
|__执行in的scrub_finished()表示该inode的scrub工作已经完成
|__执行finisher->queue()表示此scrub操作已经完成,需要执行下一个操作
以上是“ScrubStack类有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。