您好,登錄后才能下訂單哦!
小編給大家分享一下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類有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。