ScrubStack類有什么用

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

我們提供的服務(wù)有:網(wǎng)站設(shè)計制作、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、屯留ssl等。為上千家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的屯留網(wǎng)站制作公司

ScrubStack類用于臨時保存待進行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進行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操作正在進行中

               |__從inode_stack數(shù)組的首部取出下一個待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數(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ù)進行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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

標(biāo)題名稱:ScrubStack類有什么用
網(wǎng)頁鏈接:http://bm7419.com/article16/jdcidg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站設(shè)計公司定制網(wǎng)站、Google、域名注冊、網(wǎng)站建設(shè)、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計