久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

ScrubStack類有什么用

162次閱讀
沒有評論

共計 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 行業資訊頻道!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-16發表,共計3865字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 顺昌县| 大安市| 双柏县| 嘉祥县| 彰化县| 珲春市| 称多县| 苏州市| 临夏县| 大悟县| 五指山市| 滁州市| 荥阳市| 社会| 望谟县| 沁阳市| 雅安市| 龙门县| 邻水| 施秉县| 泰兴市| 云龙县| 齐河县| 延津县| 和硕县| 浠水县| 通化县| 昌乐县| 拜泉县| 深水埗区| 长乐市| 龙胜| 重庆市| 哈巴河县| 晋城| 黑山县| 罗源县| 东宁县| 罗定市| 阿瓦提县| 亳州市|