您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“ceph中LogSegment類有什么用”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“ceph中LogSegment類有什么用”這篇文章吧。
LogSegment類說明:
class LogSegment {
const log_segment_seq_t seq; 記錄LogSegment序號
uint64_t offset, end; 記錄偏移位置和結束位置
int num_events; 記錄event的數量
elist<CDir*> dirty_dirfrags, new_dirfrags; 記錄有變化的CDir結構
elist<CDentry*> dirty_dentries; 記錄有變化的CDentry結構
elist<CInode*> dirty_inodes; 記錄有變化的CInode
elist<CInode*> dirty_parent_inodes, dirty_dirfrag_dir, dirty_dirfrag_nest, dirty_dirfrag_dirfragtree
elist<CInode*> open_files;
...
};
LogSegment用來記錄實際變化的CDir/CDentry/CInode的信息,LogSegment是整個MDLog最底層的數據結構
LogSegment類的方法:
LogSegment::try_to_expire(mds, gather_bld, op_prio)
|__遍歷new_dirfrags/dirty_dirfrags數組
|__將數組中的內容插入到commit數組
|__遍歷dirty_dentries數組
|__將數組中成員的CDentry::get_dir()插入到commit數組
|__遍歷dirty_inodes數組
|__將數組中成員的CInode::get_parent_dn()::get_dir()插入到commit數組
|__遍歷commit數組
|__若commit數組成員can_auth_pin()
|__CDir::commit() 提交針對CDir的修改
|__若commit數組成員!can_auth_pin()
|__CDir::add_waiter(CDir::WAIT_UNFREEZE) 添加到等待隊列中
|__遍歷uncommitted_masters數組
|__mds->mdcache->wait_for_uncommitted_master() 等待客戶端回復commit
|__遍歷uncommitted_fragments數組
|__mds->mdcache->wait_for_uncommitted_fragment() 等待未收到commit的fragment
|__遍歷dirty_dirfrag_dir數組
|__mds->locker->scatter_nudge() 等待dirlock flush
|__遍歷dirty_dirfrag_dirfragtree數組
|__mds->locker->scatter_nudge() 等待dirfragtreelock flush
|__遍歷dirty_dirfrag_nest數組
|__mds->locker->scatter_nudge() 等待nest flush
|__遍歷open_files數組
|__數組中的CInode是授權的并且有訪問權限的
|__若LogEvent為空
|__創建一個新的EOpen類對象
|__mds->mdlog->start_entry(EOpen) 將新的EOpen類對象寫入到mdlog
|__le->add_clean_inode() 將inode添加到LogEvent的clean inode數組中
|__ls->open_files.push_back() 插入到LogSegment的open_files數組
|__數組中的CInode是授權的但沒有訪問權限
|__in->item_open_file.remove_myself() 從item_open_file數組中刪除此CInode
|__若le不為空
|__mds->mdlog->submit_entry(le) 提交LogEvent到MDLog中
|__遍歷dirty_parent_inodes數組
|__若數組中元素can_auth_pin()
|__CInode::store_backtrace()
|__若數組中元素不能can_auth_pin()
|__CInode::add_waiter(CInode::WAIT_UNFREEZE) 等待unfreeze
|__遍歷slave_updates數組
|__更新MDSlaveUpdate::waiter = gather_bld.new_sub() 等待slave update
|__檢查inotablev是否大于mds->inotable->get_committed_version()
|__mds->inotable->save() 保存inotable
|__檢查sessionmapv是否大于mds->sessionmap.get_committed()
|__mds->sessionmap.save() 保存sessionmap
|__mds->sessionmap.save_if_dirty() 保存sessionmap
|__遍歷pending_commit_tids數組
|__從數組中得到MDSTableClient類對象
|__MDSTableClient::wait_for_ack() 等待未應答的commit
|__遍歷tablev數組
|__從數組中得到MDSTableServer類對象
|__若tablev數組中的version值大于MDSTableServer::get_committed_version()
|__MDSTableServer::save() 保存MDSTableServer
|__遍歷truncating_inodes數組
|__CInode::add_waiter(CInode::WAIT_TRUNC) 等待TRUNC
|__mds->mdlog->flush() 刷新mdlog
以上是“ceph中LogSegment類有什么用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。