org.apache.zookeeper.KeeperException$ConnectionLossException: KeeperErrorCode = 当我获取 zk 的子节点时发生连接丢失



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

但是,如果子节点太多,则会发生 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

有人帮我一个忙

最后,我找到了源原因.子节点太 many.so 来自服务器的数据包长度超过客户端数据包的长度限制(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(to, pendingQueue, outgoingQueue, ClientCnxn.this(; -> doIO(pendingQueue, outgoingQueue, cnxn(; -> readLength((; -> cleanup((; -> conLossPacket(p(

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

最新更新