irpas技术客

zookeeper源码解析(十一)_par_ser

网络 6327

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 Set<String> getEphemerals(long sessionId) { HashSet<String> retv = ephemerals.get(sessionId); //若该会话没有临时节点 if (retv == null) { return new HashSet<String>(); } //对得到的临时节点路径set拷贝一份,然后return Set<String> cloned = null; synchronized (retv) { cloned = (HashSet<String>) retv.clone(); } return cloned; }

getContainers:

//获取Containers,即存储容器节点路径的集合,但是是拷贝份,并且实际类型为HashSet public Set<String> getContainers() { return new HashSet<String>(containers); }

getTtls:

//获取ttl节点路径的集合,并且是拷贝份,且实际类型为HashSet public Set<String> getTtls() { return new HashSet<String>(ttls); }

?getSessions,getNode,getNodeCount,getWatchCount:

//获取会话id集合 public Collection<Long> getSessions() { 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 (HashSet<String> set : ephemerals.values()) { //加上一个会话的临时节点的数目 result += set.size(); } return result; }

approximateDataSize:?

//获取近似的数据节点占的存储空间 public long approximateDataSize() { long result = 0; //遍历获取每个键值对对象 for (Map.Entry<String, DataNode> entry : 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); }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #zookeeper源码解析十一 #PUBLIC #void #addConfigNode