apache-zookeeper - 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
有人帮我一个忙
解决方案
最后,我找到了根源。子节点太多。所以来自服务器的数据包长度超过了客户端数据包的长度限制(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”可能会误导用户。
推荐阅读
- mongodb - Mongodb Atlas: MongoError: user is not allowed to do action [insert] on [test.products]
- python - 使用python勾选数据重组
- python - python在使用scapy时打印出奇怪的线条
- elasticsearch - Stormcrawler 速度慢,延迟高,爬取 300 个域
- javascript - 如何检查 GeoJSON 特征是否为矩形并找到角坐标?
- html - 带有 Ionic 的圆形标签
- entity-framework - EntityFramework:如何修改 edmx 以更改实体名称和属性的格式
- elasticsearch - 如何在 elaticsearch 中索引问题和答案
- java - Gson 使用通用代码将枚举序列化和反序列化为整数
- c# - Xamarin Auth 包在 Xamarin tvos 中工作?