您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關EMetaBlob類有什么用,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
EMetaBlob用于記錄CDir和CDentry的Log
EMetaBlob類說明:
class EMetaBlob: public LogEvent {
};
EMetaBlob類的方法:
EMetaBlob::add_dir_context(dir, mode) 將dir及其父目錄添加到EMetaBlob類中
|__檢查當前lump_map集合中是否已經包含dir
|__直接返回
|__從dir目錄開始依次向根目錄遍歷
|__得到dir的CInode(diri)和CDentry(parent)
|__若mode==TO_AUTH_SUBTREE_ROOT
|__若dir是subtree_root并且已經是auth的
|__退出遍歷
|__若dir是subtree_root但不是auth的
|__將maybe數組(CDentry list)插入到parents數組的首部
|__若diri已經journal過了
|__退出遍歷
|__若diri->last_journaled >= last_subtree_map 說明從last subtree map開始,該inode已經寫入日志了
|__maybenot=true
|__若已經是根目錄了(parent為空)
|__退出遍歷
|__maybenot==true
|__將parent插入到maybe數組中
|__maybenot==false
|__將parent插入到parents數組中
|__dir=parent->get_dir() 從當前dir開始向根目錄遞進
|__將maybe數組插入到parents數組的首部
|__遍歷parents數組
|__add_dentry() 將parents數組中成員添加到EMetaBlob類中
EMetaBlob::update_segment(ls) 更新LogSegment的inotablev和sessionmapv
|__若inotablev不為空
|__ls->inotablev=inotablev
|__若sessionmapv不為空
|__ls->sessionmapv=sessionmapv
EMetaBlob::fullbit::update_inode(mds, in)
|__用EMedaBlob類對象中的數據初始化CInode類對象
EMetaBlob::get_inodes(inodes)
|__遍歷lump_map集合
|__得到lump_map結合中每個成員的dirfrag的inode號
|__將inode號插入到inodes數組中
|__從lump_map中得到dirlump信息
|__遍歷dirlump中的fullbit
|__將dirlump中fullbit對應的inode號插入到inodes數組中
|__遍歷dirlump中的remotebit
|__將remotebit的inode號插入到inodes數組中
EMetaBlob::get_dentries(dentries)
|__遍歷lump_map集合
|__從lump_map中得到dirlump信息
|__從dirlump結構中分別得到full_dentry/remote_dentry/null_dentry信息
|__遍歷full_dentry數組
|__將full_dentry數組中成員的dn(dentry name)插入到dentries數組中
|__遍歷remote_dentry數組
|__將remote_dentry數組中成員的dn(dentry name)插入到dentries數組中
|__遍歷null_dentry數組
|__將null_dentry數組中成員的dn(dentry name)插入到dentries數組中
EMetaBlob::get_paths(paths) 從dirlump結構中得到所有的絕對目錄信息
|__若lump_map為空且roots不為空
|__將”/“插入到paths數組
|__遍歷lump_map集合
|__得到full_dentry/remote_dentry/null_dentry數組
|__遍歷full_dentry數組
|__將full_dentry數組成員中的dentry name插入到children數組中,即:children[dir_ino].push_back(dentry)
|__更新ino_locations數組,即:ino_locations[(*iter)->inode.ino] = Location(dir_ino, dentry)
|__遍歷remote_dentry數組
|__將remote_dentry數組成員中的dentry name插入到children數組中,即:children[dir_ino].push_back(dentry)
|__遍歷null_dentry數組
|__將null_dentry數組成員中的dentry name插入到children數組中,即:children[dir_ino].push_back(dentry)
|__遍歷lump_map集合
|__得到full_dentry/remote_dentry/null_dentry數組
|__遍歷full_dentry數組
|__若在children數組中沒有找到對應的節點,則說明此節點是葉子節點
|__將節點的inode和dentry信息插入到leaf_locations數組中,即:leaf_locations.push_back(Location(dir_ino, dentry))
|__遍歷remote_dentry數組
|__將節點的inode和dentry信息插入到leaf_locations數組中,即:leaf_locations.push_back(Location(dir_ino, dentry))
|__遍歷null_dentry數組
|__將節點的inode和dentry信息插入到leaf_locations數組中,即:leaf_locations.push_back(Location(dir_ino, dentry))
|__遍歷leaf_locations數組
|__得到inode號和對應的path
|__在ino_locations數組中遍歷查找inode號,若查找成功
|__將ino_locations數組中對應的path值添加到path的前面,即:構成當前path的上一級path目錄信息
|__inode號更新為ino_locations對應的inode號
|__將得到的path值插入到paths數組中
EMetaBlob::replay(mds, logseg, slaveup)
|__遍歷roots數組
|__從MDCache中得到CInode信息,即:mds->mdcache->get_inode()
|__若MDCache中沒有CInode信息
|__創建一個新的CInode類對象
|__EMetaBlob::fullbit::update_inode() 使用fullbit信息更新CInode信息
|__若roots成員是dirty的
|__設置CInode為dirty
|__若renamed_dirino不為空
|__從MDCache中得到CInode信息,即:mds->mdcache->get_inode(renamed_dirino)
|__遍歷lump_order數組
|__從lump_map數組中得到dirlump信息
|__dirlump的nnull不為空
|__更新nnull個數,即:nnull += lump.nnull
|__遍歷lump_order數組
|__從lump_map數組中得到dirlump信息
|__從MDCache中得到dirfrag對應的CDir信息,即:mds->mdcache->get_force_dirfrag()
|__若CDir為空
|__從MDCache中得到該CDir對應的CInode信息,即:mds->mdcache->get_inode()
|__若CInode為空
|__若CDir對應的CInode號是MDSDIR的范圍
|__從MDCache中創建一個CInode,即:mds->mdcache->create_system_inode()
|__清除新建的CInode的AUTH標識,即:diri->state_clear(STATE_AUTH)
|__若CDir對應的CInode號不是MDSDIR的范圍
|__assert(0)
|__根據CInode得到CDir信息,即:diri->get_or_open_dirfrag()
|__若CInode對應的號是ROOT或MDSDIR
|__調整subtree的auth,即:mds->mdcache->adjust_subtree_auth()
|__設置CDir的version/fnode信息
|__若dirlump是is_importing()
|__設置CDir STATE_AUTH標志,清除STATE_COMPLETE標志
|__若dirlump是is_dirty()
|__CDir::_mark_dirty()
|__若dir->fnode.rstat != dir->fnode.accounted_rstat 說明有dirty nestinfo
|__mds->locker->mark_updated_scatterlock()
|__logseg->dirty_dirfrag_nest.push_back(dir->inode->item_dirty_dirfrag_nest)
|__若dir->fnode.fragstat != dir->fnode.accounted_fragstat 說明有dirty fragstat
|__mds->locker->mark_updated_scatterlock()
|__logseg->dirty_dirfrag_dir.push_back(dir->inode->item_dirty_dirfrag_nest)
|__若lump是is_dirty_dft()
|__設置dir的狀態為DIRTYDFT,即:dir->state_set(STATE_DIRTYDFT)
|__mds->locker->mark_updated_scatterlock()
|__logseg->dirty_dirfrag_dirfragtree.push_back(dir->inode->item_dirty_dirfrag_nest)
|__若lump是is_new()
|__設置dir是new的,即:dir->mark_new()
|__若lump是is_complete()
|__設置dir是complete的,即:dir->mark_complete()
|__從lump中解析出dfull/dremote/dnull信息,即:lump._decode_bits()
|__遍歷full_dentry數組
|__得到dnlast對應的CDentry對象,即:dir->lookup_exact_snap(dn, dnlast)
|__若CDentry對象為空
|__向dir添加一個空的dentry,即:dir->add_null_dentry()
|__根據full_dentry的dentry version信息,設置dentry的版本信息
|__若CDentry對象不為空
|__根據full_dentry的dentry version信息,設置dentry的版本信息
|__設置dentry的first為full_entry的dnfirst
|__若lump是is_importing()
|__設置dentry的狀態為AUTH,即:dn->state_set(STATE_AUTH)
|__從MDCache中得到dnlast的CInode信息,即:mds->mdcache->get_inode(ino, dnlast)
|__若CInode信息為空
|__創建一個新的CInode類對象
|__使用full_dentry信息初始化新的CInode類對象,即:p->update_inode(mds, in)
|__將新的CInode添加到MDCache中,即:mds->mdcache->add_inode(in)
|__若dentry的linkage不為空
|__若dentry的linkage是primary
|__將dir放入到unlinked數組中 應該被刪除掉的
|__解除dir和dentry之間的對應關系,即:dir->unlink_inode(dn)
|__若CInode位于unlinked數組中
|__將CInode插入到linked數組中
|__設置dir的primary link inode,即:dir->link_primary_inode(dn, in)
|__若CInode信息不為空
|__設置CInode的first值,即:in->first = p->dnfirst
|__使用full_dentry信息初始化新的CInode類對象,即:p->update_inode(mds, in)
|__若dentry的linkage不是CInode并且CInode有parent dentry
|__將CInode的parent dir放入unlinked數組
|__解除CInode與其parent dir的對應關系,即:in->get_parent_dir()->unlink_inode(in->get_parent_dn())
|__若dentry的linkage不是CInode
|__若dentry的linkage不為空
|__若dentry的linkage是primary
|__將dir放入到unlinked數組中 應該被刪除掉的
|__解除dir和dentry之間的對應關系,即:dir->unlink_inode(dn)
|__若CInode位于unlinked數組中
|__將CInode插入到linked數組中
|__設置dir的primary link inode,即:dir->link_primary_inode(dn, in)
|__若full_dentry是is_dirty()
|__設置CInode為dirty, 即:in->_mark_dirty(logseg)
|__若full_dentry是is_dirty_parent()
|__設置CInode為dirty parent,即:in->_mark_dirty_parent()
|__若dentry是is_auth()
|__設置CInode的狀態為AUTH,即:in->state_set(STATE_AUTH)
|__遍歷remote dentry數組
|__得到dnlast對應的CDentry對象,即:dir->lookup_exact_snap(dn, dnlast)
|__若CDentry對象為空
|__向dir添加一個新的remote dentry,即:dir->add_remote_dentry()
|__根據remote_dentry的dentry version信息,設置dentry的版本信息
|__若CDentry對象不為空
|__若dentry的linkage不為空
|__若dentry的linkage是primary
|__將dir插入到unlinked數組中
|__解除dir與dentry之間的關聯,即:dir->unlink_inode(dn)
|__向dir添加remote inode,即:dir->link_remote_inode()
|__根據remote_dentry的dentry version信息,設置dentry的版本信息
|__設置dentry的first為remote_dentry的first
|__若lump是is_importing()
|__設置dentry的狀態為AUTH,即:dn->state_set(STATE_AUTH)
|__遍歷null_dentry數組
|__得到dnlast對應的CDentry對象,即:dir->lookup_exact_snap(dn, dnlast)
|__若CDentry對象為空
|__向dir添加一個新的remote dentry,即:dir->add_remote_dentry()
|__根據remote_dentry的dentry version信息,設置dentry的版本信息
|__若CDentry對象不為空
|__設置dentry的first為null_dentry的first
|__若dentry的linkage不為空
|__將dir插入到unlinked數組中
|__解除dir與dentry之間的關聯,即:dir->unlink_inode(dn)
|__根據null_dentry的版本信息,設置dentry的版本信息
|__若lump是is_importing()
|__設置dentry的狀態為AUTH,即:dn->state_set(STATE_AUTH)
|__若renamed_dirino不為空
|__若renamed_diri不為空
|__設置olddir為unlinked[renamed_diri]
|__若renamed_diri為空
|__從MDCache中得到renamed_diri,即:mds->mdcache->get_inode(renamed_dirino)
|__若olddir不為空
|__從renamed_diri的dirfragtree上得到所有的葉子節點,即:renamed_diri->dirfragtree.get_leaves()
|__遍歷葉子節點
|__根據葉子節點找到對應的CDir信息
|__若CDir沒有被認證
|__將CDir對應的CInode插入到slaveup的olddirs中,即:slaveup->olddirs.insert(dir->inode)
|__若CDir被認證
|__設置dir的狀態為AUTH,即:dir->state_set(STATE_AUTH)
|__更新MDCache中的subtree信息,即:mds->mdcache->adjust_subtree_after_rename()
|__從MDCache中得到olddir的subtree_root的CDir信息
|__若subtree_root未認證
|__若slaveup不為空
|__將olddir對應的CInode插入到slaveup的olddirs中,即:slaveup->olddirs.insert(dir->inode)
|__若slaveup為空
|__更新MDCache的subtree信息,即:mds->mdcache->try_trim_non_auth_subtree()
|__若renamed_diri被認證
|__遍歷renamed_dir_frags數組
|__從renamed_diri這個CInode得到其dirfrag的CDir信息,即:reanmed_diri->get_dirfrag()
|__若CDir信息存在
|__遍歷下一個
|__創建一個新的CDir對象,即:renamed_diri->get_or_open_dirfrag()
|__清除新建的CDir的AUTH,即:dir->state_clear(STATE_AUTH)
|__調整MDCache中的subtree信息,即:mds->mdcache->adjust_subtree_auth()
|__從unlinked數組中刪除renamed_diri
|__遍歷unlined數組
|__調整MDCache中的subtree信息,即:mds->mdcache->adjust_subtree_after_rename()
|__若unlinked數組不為空
|__遍歷linked數組
|__從unlinked數組中刪除linked數組中的成員
|__遍歷unlinked數組
|__若slaveup不為空
|__將unlinked信息插入到slaveup的unlinked數組中,即:slaveup->unlinked.insert()
|__若slaveup為空
|__更新MDCache,即:mds->mdcache->remove_inode_recursive()
|__遍歷table_tids數組(遍歷table client)
|__得到MDSTableClient類對象,即:mds->get_table_client()
|__執行client的got_journaled_agree()函數,即:client->got_journaled_agree()
|__若opened_ino不為空
|__從MDCache中得到opened_ino對應的CInode,即:mds->mdcache->get_inode()
|__將CInode的item_open_file插入到logseg的open_files數組中,即:logseg->open_files.push_back()
|__若inotablev不為空
|__若mds的inotable版本號小于inotablev
|__若allocated_ino不為空
|__重新分配inode號,即:mds->inotable->replay_alloc_id()
|__若preallocated_inos不為空
|__重新分配inode號,即:mds->inotable->replay_alloc_id()
|__若sessionmapv不為空
|__若mds的sessionmap版本號+2>=sessionmapv
|__根據client_name得到session信息,即:mds->sessionmap.get_session()
|__若session不為空
|__重新執行dirty的session,即:mds->sessionmap.replay_dirty_session()
|__若session為空
|__執行advance version,即:mds->sessionmap.replay_advance_version()
|__遍歷truncate_start數組
|__從MDCache中得到對應的CInode信息,即:mds->mdcache->get_inode()
|__在MDCache中執行add recovered truncate,即:mds->mdcache->add_recovered_truncate()
|__遍歷truncate_finish數組
|__從MDLog中得到對應的LogSegment,即:mds->mdlog->get_segment()
|__從MDCache中得到對應的CInode信息,即:mds->mdcache->get_inode()
|__在MDCache中執行remove recovered truncate,即:mds->mdcache->remove_recovered_truncate()
|__遍歷destroyed_inodes數組
|__從MDCache中得到對應的CInode信息,即:mds->mdcache->get_inode()
|__在MDCache中刪除對應的CInode,即:mds->mdcache->remove_inode()
|__遍歷client_reqs數組
|__從sessionmap中得到對應的Session類對象,即:mds->sessionmap.get_session()
|__在Session對象中添加completed request,即:session->add_completed_request()
|__若client_reqs數組中包含trim的session
|__在Session對象中執行trim completed request,即:session->trim_completed_request()
|__遍歷client_flushes數組
|__從sessionmap中得到對應的Session類對象,即:mds->sessionmap.get_session()
|__在Session對象中添加completed request,即:session->add_completed_request()
|__若client_reqs數組中包含trim的session
|__在Session對象中執行trim completed request,即:session->trim_completed_request()
|__更新LogSegment信息,即:update_segment(logseg)
關于“EMetaBlob類有什么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。