houshuai created ZOOKEEPER-4525:
-----------------------------------
Summary: Thread leaks occur when resolve address failed.
Key: ZOOKEEPER-4525
URL: https://issues.apache.org/jira/browse/ZOOKEEPER-4525
Project: ZooKeeper
Issue Type: Bug
Components: java client
Affects Versions: 3.6.3
Environment: {code:java}
import org.apache.zookeeper.ClientCnxn;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.server.ZooKeeperThread;
import java.lang.reflect.Field;
public class Main extends Thread {
public static void main(String[] args) {
new Main().start();
}
@Override
public void run() {
System.setProperty("zookeeper.serverCnxnFactory",
"org.apache.zookeeper.server.NettyServerCnxnFactory");
System.setProperty("zookeeper.clientCnxnSocket",
"org.apache.zookeeper.ClientCnxnSocketNetty");
ZooKeeperThread eventThread = null;
try {
ZooKeeper zooKeeper = new ZooKeeper("a.local:4096", 50000,
watchedEvent -> {
});
Field cnxnField = zooKeeper.getClass().getDeclaredField("cnxn");
cnxnField.setAccessible(true);
ClientCnxn clientCnxn = (ClientCnxn) cnxnField.get(zooKeeper);
Field eventThreadField =
clientCnxn.getClass().getDeclaredField("eventThread");
eventThreadField.setAccessible(true);
eventThread = (ZooKeeperThread) eventThreadField.get(clientCnxn);
zooKeeper.close();
} catch (Exception ignore) {
ignore.printStackTrace();
}
System.out.println(eventThread.getState());
}
}
{code}
Reporter: houshuai
Attachments: stacktrace.txt
In version 3.6. When connecting zookeeper using domain name with Netty. If the
domain name failed to resolve, calling Zookeeper::close cannot close the
EventThread. It will cause thread leaks.
When resolve address failed, the connect thread in ClientCnxn throws an
UnknownHostException. ClientCnxnSocketNetty.firstConnect has not been
initialized.
When the close method is called, it calls firstConnect.countDown().It will
throw a NullPointerException and the thread cannot be closed properly.
--
This message was sent by Atlassian Jira
(v8.20.7#820007)