ScrubStack类有什么用

81次阅读
没有评论

共计 3865 个字符,预计需要花费 10 分钟才能阅读完成。

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-16发表,共计3865字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)