LogSegment類分析

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

相關文章
相關標籤/搜索