فهرست منبع

ZOOKEEPER-3112: fix fd leak due to UnresolvedAddressException on connect

SocketChannel.connect() can throw different kind of exceptions but ClientCnxnSocketNIO.connect() handles only IOException. This could lead to FD leak when socked is opened but is not connected. We should handle some additional exception classes and close the socket.

Author: Alexey.Saltanov <Alexey.Saltanov@billing.ru>

Reviewers: Enrico Olivelli <eolivelli@apache.org>, Mate Szalay-Beko <symat@apache.org>

Closes #1410 from saltos/ZOOKEEPER-3112
Alexey.Saltanov 4 سال پیش
والد
کامیت
6a8728d983
1فایلهای تغییر یافته به همراه3 افزوده شده و 1 حذف شده
  1. 3 1
      zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNIO.java

+ 3 - 1
zookeeper-server/src/main/java/org/apache/zookeeper/ClientCnxnSocketNIO.java

@@ -26,6 +26,8 @@ import java.nio.ByteBuffer;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.SelectionKey;
 import java.nio.channels.Selector;
 import java.nio.channels.Selector;
 import java.nio.channels.SocketChannel;
 import java.nio.channels.SocketChannel;
+import java.nio.channels.UnresolvedAddressException;
+import java.nio.channels.UnsupportedAddressTypeException;
 import java.util.Iterator;
 import java.util.Iterator;
 import java.util.Queue;
 import java.util.Queue;
 import java.util.Set;
 import java.util.Set;
@@ -266,7 +268,7 @@ public class ClientCnxnSocketNIO extends ClientCnxnSocket {
         SocketChannel sock = createSock();
         SocketChannel sock = createSock();
         try {
         try {
             registerAndConnect(sock, addr);
             registerAndConnect(sock, addr);
-        } catch (IOException e) {
+        } catch (UnresolvedAddressException | UnsupportedAddressTypeException | SecurityException | IOException e) {
             LOG.error("Unable to open socket to {}", addr);
             LOG.error("Unable to open socket to {}", addr);
             sock.close();
             sock.close();
             throw e;
             throw e;