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);
}