首页 > 解决方案 > org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss 当我得到 zk 的子节点时发生

问题描述

情况如下:我调用client.getChildren().forPath("/path"。正常情况下没有问题。

但是如果childNodes太多,就会出现Exception:org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /path。

编码:

        RetryNTimes retryNTimes = new RetryNTimes(1, 1000);
        CuratorFramework client = CuratorFrameworkFactory.newClient("xx.xx.xx.xx:2181",
                50000, 50000, retryNTimes);
        client.start();
        List<String> childNodes = client.getChildren().forPath("/path");

zkServer 为三节点集群,版本为 3.4.13。

我客户端的馆长版本是 2.12.0

有人帮我一个忙

标签: apache-zookeeper

解决方案


最后,我找到了根源。子节点太多。所以来自服务器的数据包长度超过了客户端数据包的长度限制(1024 * 4096)。所以我设置了系统属性-Djute.maxbuffer = 10485760。问题是解决了。

关系代码:

 public static final int packetLen = Integer.getInteger("jute.maxbuffer",
            4096 * 1024);

   protected void readLength() throws IOException {
        int len = incomingBuffer.getInt();
        if (len < 0 || len >= ClientCnxn.packetLen) {
            throw new IOException("Packet len" + len + " is out of range!");
        }
        incomingBuffer = ByteBuffer.allocate(len);
    }

        private void conLossPacket(Packet p) {
        if (p.replyHeader == null) {
            return;
        }
        switch (state) {
        case AUTH_FAILED:
            p.replyHeader.setErr(KeeperException.Code.AUTHFAILED.intValue());
            break;
        case CLOSED:
            p.replyHeader.setErr(KeeperException.Code.SESSIONEXPIRED.intValue());
            break;
        default:
            p.replyHeader.setErr(KeeperException.Code.CONNECTIONLOSS.intValue());
        }
        finishPacket(p);
    }
  

逻辑如下:

org.apache.zookeeper.ClientCnxn.SendThread#run; -> clientCnxnSocket.doTransport(到,pendingQueue,outgoingQueue,ClientCnxn.this);-> doIO(挂起队列,传出队列,cnxn);-> 读取长度();-> 清理();-> conLossPacket(p)

异常:“org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /path”可能会误导用户。


推荐阅读