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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值