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" 可能会误导用户。
案例如下: 我调用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" 可能会误导用户。