中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

ScrubStack類有什么用

發布時間:2021-12-18 16:59:02 來源:億速云 閱讀:134 作者:小新 欄目:云計算

小編給大家分享一下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類有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

丹巴县| 宜兰县| 抚宁县| 教育| 南投市| 弥渡县| 姚安县| 永善县| 桐梓县| 五常市| 元阳县| 泰来县| 昂仁县| 哈尔滨市| 临夏市| 溆浦县| 瑞丽市| 彰化市| 阿尔山市| 陆川县| 古丈县| 昌都县| 大同市| 芦溪县| 荥阳市| 海宁市| 浦东新区| 昭通市| 新泰市| 宜春市| 农安县| 孝义市| 青铜峡市| 临澧县| 周宁县| 广宗县| 日土县| 合肥市| 尚义县| 上高县| 高清|