zookeeper源码解析(十一)

zookeeper源码解析(十一),第1张

zookeeper源码解析(十一)

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 getEphemerals(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 Set getContainers() {
        return new HashSet(containers);
    }

getTtls:

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

 getSessions,getNode,getNodeCount,getWatchCount:

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

approximateDataSize: 

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

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5665723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存