温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SnapRealm类的示例代码

发布时间:2021-12-18 16:52:58 来源:亿速云 阅读:167 作者:小新 栏目:云计算

这篇文章主要介绍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类的示例代码”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI