温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ScrubStack类有什么用

发布时间:2021-12-18 16:59:02 来源:亿速云 阅读:113 作者:小新 栏目:云计算

小编给大家分享一下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类有什么用”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI