您好,登錄后才能下訂單哦!
小編給大家分享一下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è)資訊頻道!
免責(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)容。