溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ScrubStack類有什么用

發(fā)布時間:2021-12-18 16:59:02 來源:億速云 閱讀:132 作者:小新 欄目:云計算

小編給大家分享一下ScrubStack類有什么用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

ScrubStack類用于臨時保存待進(jìn)行Scrub的文件或目錄,對于目錄來說,最終調(diào)用dir->scrub_initialize()函數(shù)執(zhí)行實際的scrub操作;對于文件來說,最終調(diào)用inode->validate_disk_state()函數(shù)執(zhí)行實際的scrub操作。

ScrubStack類說明:

class ScrubStack {

     Finisher *finisher;                            finisher用于處理Scrub完成后的回調(diào)處理

     elist<CInode*> inode_stack;          等待Scrub的Inode棧

     int scrubs_in_progress;                  目前正在處于scrub的數(shù)量

     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()

     |__設(shè)置in的PIN_SCRUBQUEUE

     |__遞增stack_size

|__將in的item_scrub插入到inode_stack數(shù)組的頭部

ScrubStack::push_inode_bottom(in)

|__檢查in的item_scrub是否不在inode_stack列表上,即:in->item_scrub.is_on_list()

     |__則設(shè)置in的PIN_SCRUBQUEUE

     |__遞增stack_size

|__將in的item_scrub插入到inode_stack數(shù)組的尾部

ScrubStack::pop_inode(in)

|__清除in的PIN_SCRUBQUEUE

|__將in的item_scrub從inode_stack數(shù)組中刪除

|__遞減stack_size

ScrubStack::_enqueue_inode(in, parent, header, on_finish, top)

|__對于in執(zhí)行scrub初始化的工作,即:in->scrub_initialize(parent, header, on_finish)

|__top==true

     |__調(diào)用push_inode(in),將in插入到inode_stack的首部

|__top==false

     |__調(diào)用push_inode_bottom(in),將in插入到inode_stack的尾部

ScrubStack::enqueue_inode(in, header, on_finish, top)

|__調(diào)用_enqueue_inode()函數(shù),對inode進(jìn)行scrub的初始化工作并且將in插入到inode_stack數(shù)組中

|__調(diào)用kick_off_scrubs()函數(shù)來執(zhí)行scrub操作

ScrubStack::kick_off_scrubs()

|__從頭開始遍歷inode_stack數(shù)組并且配置文件中的mds_max_scrub_ops_in_progress > scurbs_in_progress

     |__若待scrub的inode不是目錄(普通文件/符號鏈接/硬鏈接)

          |__調(diào)用pop_inode()函數(shù)從inode_stack數(shù)組中刪除待scrub的inode

          |__若待scrub的inode沒有設(shè)置on_finish

               |__遞增scrubs_in_progress

               |__設(shè)置finisher回調(diào)函數(shù)為scrub_tick

          |__調(diào)用scrub_file_inode(curi)               執(zhí)行實際的scrub操作

          |__設(shè)置can_continue=true

     |__若待scrub的inode是目錄

          |__調(diào)用scrub_dir_inode()                    執(zhí)行實際的scrub操作

          |__若scrub操作完成

               |__調(diào)用pop_inode(curi)從inode_stack數(shù)組中刪除待scrub的inode

          |__若scrub操作正在進(jìn)行中

               |__從inode_stack數(shù)組的首部取出下一個待scrub的inode

ScrubStack::scrub_dir_inode(in, added_children, terminal, done)

|__從in的scrub_info中得到header信息

|__若header的recursive==true

     |__從in中得到正在進(jìn)行scrub操作的dirfrags,即:in->scrub_dirfrags_scrubbing(scrubbing_frags)

     |__遍歷scrubbing_frags數(shù)組

          |__得到dirfrag對應(yīng)的CDir類對象

          |__若CDir類對象不為空

               |__將CDir類對象插入到scrubbing_cdirs數(shù)組中

          |__若CDir類對象為空

               |__完成in的dirfrag的scrub操作,即:in->scrub_dirfrag_finished(*i)

     |__若配置文件中的msd_max_scrub_ops_in_progress > scrubs_in_progress

          |__從scrubbing_cdirs數(shù)組中獲取一個成員

               |__若scrubbing_cdirs為空

                    |__調(diào)用get_next_cdir()函數(shù)獲取下一個待scrub的目錄

                    |__將待scrub的目錄插入到scrubbing_cdirs數(shù)組中

          |__調(diào)用scrub_dirfrag()執(zhí)行實際的scrub操作

|__若所有的dirfrags都完成了scrub

     |__調(diào)用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

|__設(shè)置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

          |__設(shè)置in的scrub finisher為scrub_tick

     |__執(zhí)行in的scrub_children_finished()

     |__執(zhí)行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的內(nèi)容,即:dir->fetch(scrub_kick)

          |__直接返回

     |__執(zhí)行dir的scrub_initialize()函數(shù)進(jìn)行scrub的初始化工作

|__執(zhí)行dir的scrub_dentry_next()函數(shù)獲取到下一個待scrub的dentry,即:dir->scrub_dentry_next()

|__調(diào)用_enquue_inode()將待scrub的dentry插入到待scrub的隊列中

ScrubStack::scrub_file_inode(in)

|__執(zhí)行in的validate_disk_state()

ScrubStack::_validate_inode_done(in, r, result)

|__執(zhí)行in的scrub_finished()表示該inode的scrub工作已經(jīng)完成

|__執(zhí)行finisher->queue()表示此scrub操作已經(jīng)完成,需要執(zhí)行下一個操作

以上是“ScrubStack類有什么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI