LogSegment類說明:node
class LogSegment {數組
const log_segment_seq_t seq; 記錄LogSegment序號session
uint64_t offset, end; 記錄偏移位置和結束位置數據結構
int num_events; 記錄event的數量ui
elist<CDir*> dirty_dirfrags, new_dirfrags; 記錄有變化的CDir結構對象
elist<CDentry*> dirty_dentries; 記錄有變化的CDentry結構隊列
elist<CInode*> dirty_inodes; 記錄有變化的CInoderem
elist<CInode*> dirty_parent_inodes, dirty_dirfrag_dir, dirty_dirfrag_nest, dirty_dirfrag_dirfragtreeget
elist<CInode*> open_files;it
...
};
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