2021SC@SDUSC
前言上一篇文章我们对DataTree类的每一个变量的含义都做了具体的阐释,本文将继续介绍DataTree类的函数方法。
函数方法之前的文章中已经介绍过DataTree的构造函数,在此不再赘述。
addConfigNode:
添加配置节点,其完整路径为/zookeeper/config,用于维护zookeeper的配置信息。
public void addConfigNode() { DataNode zookeeperZnode = nodes.get(procZookeeper); //在正常情况下,都应该能获取到路径为/zookeeper的节点,若没有,抛异常 if (zookeeperZnode != null) { //一方面维护好节点的子节点信息 zookeeperZnode.addChild(configChildZookeeper); } else { assert false : "There's no /zookeeper znode - this should never happen."; } //另一方面,维护好整个DataTree的节点哈希表的信息 nodes.put(configZookeeper, new DataNode(new byte[0], -1L, new StatPersisted())); try { //设置配置节点的ACL setACL(configZookeeper, ZooDefs.Ids.READ_ACL_UNSAFE, -1); } catch (KeeperException.NonodeException e) { //若没有配置节点,抛异常 assert false : "There's no " + configZookeeper + " znode - this should never happen."; } }
getEphemerals:
//参数为会话id,返回存储该会话对应的临时节点路径的集合,注意该集合是拷贝的 public SetgetEphemerals(long sessionId) { HashSet retv = ephemerals.get(sessionId); //若该会话没有临时节点 if (retv == null) { return new HashSet (); } //对得到的临时节点路径set拷贝一份,然后return Set cloned = null; synchronized (retv) { cloned = (HashSet ) retv.clone(); } return cloned; }
getContainers:
//获取Containers,即存储容器节点路径的集合,但是是拷贝份,并且实际类型为HashSet public SetgetContainers() { return new HashSet (containers); }
getTtls:
//获取ttl节点路径的集合,并且是拷贝份,且实际类型为HashSet public SetgetTtls() { return new HashSet (ttls); }
getSessions,getNode,getNodeCount,getWatchCount:
//获取会话id集合 public CollectiongetSessions() { return ephemerals.keySet(); } //获取指定path对应的节点 public DataNode getNode(String path) { return nodes.get(path); } //获取DataTree节点的数量 public int getNodeCount() { return nodes.size(); } //获取Watch的数量,由两部分构成,一个是dataWatches,另一个是childWatches public int getWatchCount() { return dataWatches.size() + childWatches.size(); }
getEphemeralsCount:
//获取所有会话的临时节点的数量 public int getEphemeralsCount() { int result = 0; //遍历会话 for (HashSetset : ephemerals.values()) { //加上一个会话的临时节点的数目 result += set.size(); } return result; }
approximateDataSize:
//获取近似的数据节点占的存储空间 public long approximateDataSize() { long result = 0; //遍历获取每个键值对对象 for (Map.Entryentry : nodes.entrySet()) { DataNode value = entry.getValue(); //对节点上锁,保证同步 synchronized (value) { //NodeSize考虑两方面,一是路径字符串长度,二是节点存储的内容用的字节数目 result += getNodeSize(entry.getKey(), value.data); } } return result; }
getNodeSize:
//NodeSize考虑两方面,一是路径字符串长度,二是节点存储的内容用的字节数目 private static long getNodeSize(String path, byte[] data) { return (path == null ? 0 : path.length()) + (data == null ? 0 : data.length); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)