org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss 当我得到 zk 的子节点时发生

org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss occur when I get zk's child Nodes

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

但是如果子节点太多,Exception:org。apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = ConnectionLoss for /path occurred.

代码:

        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是三节点cluster.the版本是3.4.13.

我客户端的 curator 版本是 2.12.0

有人帮我一个忙

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

相关代码:

 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#运行; -> clientCnxnSocket.doTransport(to, pendingQueue, outgoingQueue, ClientCnxn.this); -> doIO(pendingQueue, outgoingQueue, cnxn); -> 读取长度(); -> 清理(); -> conLossPacket(p)

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