SnapRealm類分析

SnapRealm類說明:
struct SnapRealm {
  sr_t srnode;        描述snap的seq、snap建立的時間、SnapInfo以及snaplink_t相關內容
  MDCache *mdcache;    描述Snap在內存中的存儲狀態
  CInode *inode;    描述snap對應的inode信息
  SnapRealm *parent;
  set<SnapRealm*> open_children;
  set<SnapRealm*> open_past_children;
  map<inodeno_t, pair<SnapRealm*, set<snapid_t>>> open_past_parents;    
  unsigned num_open_past_parents;
  snapid_t cached_seq;            self+all past+present parents的最大seq
  snapid_t cached_last_created;        all past+present parents的最大last_created
  snapid_t cached_last_destroyed;
  set<snapid_t> cached_snaps;
  SnapContext cached_snap_context;
  bufferlist cached_snap_trace;
  elist<CInode*> inodes_with_caps;            有效的realm splits
  map<client_t, xlist<Capability*>*> client_caps;    記錄全部須要snap通知的clients
};node

SnapRealm類方法:
SnapRealm::exists(name)            檢查snap name是否存在
|__遍歷srnode中snaps數組
  |__若snaps數組中的SnapInfo的name==name
    |__返回true
|__返回falseapi

SnapRealm::add_cap(client, cap)
|__若client不在client_caps數組中
  |__在client_caps數組中以client爲下標,建立一個xlist<Capability*>
|__將cap->item_snaprealm_caps添加到client_caps[client]內數組

SnapRealm::remove_cap(client, cap)
|__從cap的item_snaprealm_caps數組中刪除本身,即:cap->item_snaprealm_caps.remove_myself()
|__若client_caps[client]爲空
  |__刪除client_caps[client]
  |__狀況client_caps的client項函數

SnapRealm::add_open_past_parents(parent, last)
|__在open_past_parents數組中查找parent的inode number對應的項
  |__若找到對應的項
    |__將last插入到open_past_parents數組,即:p->second.second.insert(last)
  |__若沒有找到對應的項
    |__以parent的inode number爲索引,將parent插入到open_past_parents數組中,即:open_past_parents[parent->inode->ino()].first = parents
    |__將last插入到open_past_parents數組,即:open_past_parents[parent->inode->ino()].second.insert(last)
    |__在parent中將當前類對象插入到open_past_children集合中,即:parent->open_past_children.insert(this)
|__遞增num_open_past_parents的值ui

SnapRealm::remove_open_past_parent(ino, last)
|__在open_past_parents數組中查找ino
|__在open_past_parents數組中查找last
|__將last從open_past_parents數組中刪除
|__遞減num_open_past_parents的值
|__若open_past_parents中snapid_t集合爲空
  |__刪除open_past_parents中的snapid_t集合
  |__在open_past_parents數組中刪除parent對應的項
  |__在parent中將當前類對象從open_past_children數組中刪除,即:parent->open_past_children.erase(this)this

SnapRealm::_remove_missing_parent(snapid, parent, err)
|__在srnode中的past_parents數組中查找snapid
  |__若找到 
    |__從past_parents數組中刪除snapid對應的項,即:srnode.past_parents.erase(p)對象

SnapRealm::_open_parents(finish, first, last)
|__若parent不爲空
  |__確保當前parent的parent是open的
|__若srnode中past_parents數組個數大於num_open_past_parents
  |__遍歷srnode中past_parents數組
    |__從MDCache中獲得數組中parent對應的CInode信息,即:parent = mdcache->get_inode(p->second.ino)
    |__若parent爲空
      |__經過MDCache建立parent inode,即:mdcache->open_ino()
      |__返回false
    |__若parent當前狀態爲STATE_PURGING
      |__將parent從srnode的past_parents數組中刪除
      |__返回false
    |__打開parent的snaprealm的parent,即:parent->snaprealm->_open_parents()
    |__在open_past_parents數組中查找p->second.ino 
      |__若沒找到
    |__調用add_open_past_parent()將parent->snaprealm加入到open_past_parents數組中
|__設置open=true
|__返回true索引

SnapRealm::have_past_parents_open(first, last)
|__遍歷srnode中past_parents數組
  |__若p->second.first > last
    |__退出遍歷
  |__在open_past_parents數組中若沒有找到p->second.ino
    |__返回false
  |__在open_past_parents數組中獲得p->second.ino對應的SnapRealm類對象
  |__執行SnapRealm類對象的have_past_parents_open()函數檢查其parent是不是open的
    |__是則返回false
|__設置open=true
|__返回true內存

SnapRealm::close_parents()
|__遍歷open_past_parents數組
  |__從num_open_past_parents中減去p->second.second.size()值
  |__從open_past_parents數組中的SnapRealm類對象的open_past_children數組中刪除本身
|__清空open_past_parents數組rem

SnapRealm::build_snap_set(s, max_seq, max_last_created, max_last_destroyed, first, last)
|__若srnode的seq>max_seq
  |__max_seq = srnode.seq 
|__若srnode的last_created>max_last_created
  |__max_last_created = srnode.last_created 
|__若srnode的last_destroyed>max_last_destroyed
  |__max_last_destroyed = srnode.max_last_destroyed
|__從first開始遍歷srnode.snaps,直到srnode.snaps.snapid_t.first > last
  |__將srnode.snaps.snapid_t添加到s集合中
|__從first開始遍歷srnode.past_parents,直到srnode.snaps.snapid_t<first而且srnode.snaps.snaplink_t.first > last
  |__從MDCache中獲得parent的CInode信息
  |__調用parent的snaprealm的build_snap_set()方法
|__若srnode.current_parent_size <= last而且parent不爲空
  |__調用parent的build_snap_set()方法
  
SnapRealm::check_cache()
|__清空cached_snaps數組和cached_snap_context數組
|__根據srnode中的向對應的值,設置cached_last_created/cached_last_destroyed/cached_seq
|__調用build_snap_set(),在cached_snaps上建立snap set_ 

SnapRealm::get_snaps()
|__調用check_cache()    在cached_snaps上建立snap
|__返回cached_snaps

SnapRealm::get_snap_context()
|__調用check_cache()    在cached_snaps上建立snap
|__若cached_snap_context.seq爲空
  |__設置cached_snap_context的seq值和snaps數組的大小(根據cached_seq和cached_seq.size())
  |__遍歷cached_snaps數組
    |__將cached_snaps數組中的項添加到cached_snap_context.__將cached_snaps數組中的項添加到cached_snaps數組中
|__返回cached_snap_context

SnapRealm::get_snap_info(infomap, first, last)
|__調用get_snaps()獲得cached_snaps
|__從first開始遍歷srnode中snaps數組,直到p->first > last
  |__將srnode中snaps數組中的SnapInfo信息添加到infomap中
|__從first開始遍歷srnode中past_parents數組,直到p->first < first且p->second.first > last
  |__從MDCache中獲得parent的CInode信息
  |__調用parent的snaprealm的get_snap_info()函數獲得parent的SnapInfo信息
|__若srnode的current_parent_since<=last而且parent不爲空
  |__調用parent的get_snap_info()獲得parent的SnapInfo信息

SnapRealm::get_snapname(snapid, atino)
|__檢查snapid是否在srnode的snaps數組中
  |__檢查inode號是否等於atino
    |__返回srnode.snaps[snapid].name
  |__inode號不等於atino
    |__返回srnode.snaps[snapid].get_long_name()
|__檢查snapid是否在srnode的past_parents數組中
  |__若在而且p->second.first <= snapid
    |__從MDCache中獲得parent的CInode信息,即:mdcache->get_inode()
    |__返回oldparent->snaprealm->get_snapname()    返回oldparent的snapname
|__返回parent->get_snapname()        返回parent的snapname

SnapRealm::resolve_snapname(n, atino, first, last)
|__從first開始遍歷srnode中snaps數組,直到p->first > last
  |__若srnode中snaps數組中對應的name==n
    |__返回p->first 
|__從first開始遍歷srnode中past_parents數組,直到p->first < first而且p->second.first > last
  |__從MDCache中獲得parent的CInode信息,即:mdcache->get_inode()
  |__調用oldparent->snaprealm->resolve_snapname()    返回oldparent的snapname
|__若srnode的current_parent_since<=last而且parent不爲空
  |__調用parent->resolve_snapname()    返回parent的snapname
  
SnapRealm::adjust_parent()
|__獲得newparent,即:newparent = inode->get_parent_dn()->get_dir()->get_inode()->find_snaprealm()
|__若newparent!=parent
  |__從paernt的open_children數組中刪除本身,即:parent->open_children.erase(this)
  |__更新parent = newparent
  |__在parent的open_children數組中添加本身,即:parent->open_children.insert(this)
  |__調用invalidate_cached_snaps()    更新MDCache中的snaps信息
  
SnapRealm::split_at(child)
|__若inode是dir,但child不是dir
    |__若child對應的inode包含realm
      |__將child移入inode的realm中,即:child->inode->move_to_realm(child)
    |__直接返回
|__若child是dir
  |__遍歷open_children數組
    |__若child不在open_children數組且child的inode是open_children數組成員的祖先
      |__設置數組成員的parent爲child,即:realm->parent = child
      |__將數組成員設置到child的open_children數組中,即:child->open_children.insert(realm)
      |__在當前inode的open_children數組中刪除該項,即:open_children->erase(p)
|__遍歷inodes_with_caps數組
  |__若inodes_with_caps數組成員==child->inode
    |__設置under_child=true
  |__若inodes_with_caps數組成員!=child->inode
    |__順着inodes_with_caps數組成員依次向上遍歷父目錄的CInode
      |__若遍歷的CInode==child->inode
    |__設置under_child=true
|__若under_child==true
  |__調用in的move_to_realm(child)函數

SnapRealm::prune_past_parents() |__調用check_cache() |__遍歷srnode中past_parents數組   |__在cached_snaps數組中查到past_parents數組中snaplink_t.first      |__若在cached_snaps數組中沒有找到       |__調用remove_open_past_parent(p->second.ino, p->first)    從past_parents數組中刪除對應的項       |__刪除srnode中past_parents數組中的項,即:srnode.past_parents.erase(p)  

相關文章
相關標籤/搜索