From 07e391ee8d7381b7da4e16516a7d1fda7000e416 Mon Sep 17 00:00:00 2001 From: ulvii Date: Wed, 4 Apr 2018 17:31:16 -0700 Subject: [PATCH] Use Socket instead of SocketChannel when multiSubnetFailover=true (#662) --- .../microsoft/sqlserver/jdbc/IOBuffer.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java index 82513ea172..8813ef622e 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/IOBuffer.java @@ -2337,8 +2337,8 @@ else if (!useTnir) { findSocketUsingJavaNIO(inetAddrs, portNumber, timeoutInMilliSeconds); } else { - LinkedList inet4Addrs = new LinkedList<>(); - LinkedList inet6Addrs = new LinkedList<>(); + LinkedList inet4Addrs = new LinkedList<>(); + LinkedList inet6Addrs = new LinkedList<>(); for (InetAddress inetAddr : inetAddrs) { if (inetAddr instanceof Inet4Address) { @@ -2360,11 +2360,10 @@ else if (!useTnir) { if (!inet4Addrs.isEmpty()) { if (logger.isLoggable(Level.FINER)) { - logger.finer(this.toString() + "Using Java NIO with timeout:" + timeoutForEachIPAddressType); + logger.finer(this.toString() + "Using Java Threading with timeout:" + timeoutForEachIPAddressType); } - // inet4Addrs.toArray(new InetAddress[0]) is java style of converting a linked list to an array of reqd size - findSocketUsingJavaNIO(inet4Addrs.toArray(new InetAddress[0]), portNumber, timeoutForEachIPAddressType); + findSocketUsingThreading(inet4Addrs, portNumber, timeoutForEachIPAddressType); } if (!result.equals(Result.SUCCESS)) { @@ -2590,16 +2589,12 @@ private void findSocketUsingJavaNIO(InetAddress[] inetAddrs, // if a channel was selected, make the necessary updates if (selectedChannel != null) { - // the selectedChannel has the address that is connected successfully - // convert it to a java.net.Socket object with the address - SocketAddress iadd = selectedChannel.getRemoteAddress(); - selectedSocket = new Socket(); - selectedSocket.connect(iadd); + // Note that this must be done after selector is closed. Otherwise, + // we would get an illegalBlockingMode exception at run time. + selectedChannel.configureBlocking(true); + selectedSocket = selectedChannel.socket(); result = Result.SUCCESS; - - // close the channel since it is not used anymore - selectedChannel.close(); } } @@ -2638,7 +2633,7 @@ private Socket getConnectedSocket(InetSocketAddress addr, return selectedSocket; } - private void findSocketUsingThreading(LinkedList inetAddrs, + private void findSocketUsingThreading(LinkedList inetAddrs, int portNumber, int timeoutInMilliSeconds) throws IOException, InterruptedException { assert timeoutInMilliSeconds != 0 : "The timeout cannot be zero"; @@ -2722,6 +2717,10 @@ private void findSocketUsingThreading(LinkedList inetAddrs, } } } + + if (selectedSocket != null) { + result = Result.SUCCESS; + } } /**