共計 3865 個字符,預計需要花費 10 分鐘才能閱讀完成。
丸趣 TV 小編給大家分享一下 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 類有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注丸趣 TV 行業資訊頻道!