您好,登录后才能下订单哦!
这篇文章主要介绍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
 };SnapRealm类方法:
 SnapRealm::exists(name)            检查snap name是否存在
 |__遍历srnode中snaps数组
   |__若snaps数组中的SnapInfo的name==name
     |__返回true
 |__返回false
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的值
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)
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数组
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)
  
以上是“SnapRealm类的示例代码”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。