千家信息网

ScrubStack类有什么用

发表于:2024-10-10 作者:千家信息网编辑
千家信息网最后更新 2024年10月10日,小编给大家分享一下ScrubStack类有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!ScrubStack类用于临
千家信息网最后更新 2024年10月10日ScrubStack类有什么用

小编给大家分享一下ScrubStack类有什么用,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

ScrubStack类用于临时保存待进行Scrub的文件或目录,对于目录来说,最终调用dir->scrub_initialize()函数执行实际的scrub操作;对于文件来说,最终调用inode->validate_disk_state()函数执行实际的scrub操作。

ScrubStack类说明:

class ScrubStack {

Finisher *finisher; finisher用于处理Scrub完成后的回调处理

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

0