db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Brett Wooldridge (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (DERBY-3108) Iteratively creating and closing client connection yields java.net.BindException: Address already in use: connect after many connections
Date Thu, 08 Nov 2012 06:00:13 GMT

    [ https://issues.apache.org/jira/browse/DERBY-3108?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13492980#comment-13492980
] 

Brett Wooldridge commented on DERBY-3108:
-----------------------------------------

Sorry, I jumped the gun on the code change suggestion.  setReuseAddress() must be call before
the socket is connected, which requires a minor change to how the socket is created.  Here
is the appropriate patch (against the head):

Index: java/client/org/apache/derby/client/net/NetAgent.java
===================================================================
--- java/client/org/apache/derby/client/net/NetAgent.java	(revision 1406929)
+++ java/client/org/apache/derby/client/net/NetAgent.java	(working copy)
@@ -21,6 +21,7 @@
 
 package org.apache.derby.client.net;
 
+import java.net.InetSocketAddress;
 import java.net.SocketException;
 
 import org.apache.derby.client.am.Agent;
@@ -129,7 +130,7 @@
         }
 
         try {
-            socket_ = (java.net.Socket) java.security.AccessController.doPrivileged(new OpenSocketAction(server,
port, clientSSLMode_));
+            socket_ = (java.net.Socket) java.security.AccessController.doPrivileged(new OpenSocketAction(clientSSLMode_));
         } catch (java.security.PrivilegedActionException e) {
             throw new DisconnectException(this,
                 new ClientMessageId(SQLState.CONNECT_UNABLE_TO_CONNECT_TO_SERVER),
@@ -144,6 +145,8 @@
                 socket_.setTcpNoDelay(true); // disables nagles algorithm
                 socket_.setKeepAlive(true); // PROTOCOL Manual: TCP/IP connection allocation
rule #2
                 socket_.setSoTimeout(loginTimeout * 1000);
+                socket_.setReuseAddress(true);
+                socket_.connect(new InetSocketAddress(server, port));
             }
         } catch (java.net.SocketException e) {
             try {
@@ -153,7 +156,12 @@
             exceptionOpeningSocket_ = new DisconnectException(this,
                 new ClientMessageId(SQLState.CONNECT_SOCKET_EXCEPTION),
                 e.getMessage(), e);
+        } catch (java.io.IOException e) {
+            exceptionOpeningSocket_ = new DisconnectException(this,
+                    new ClientMessageId(SQLState.CONNECT_SOCKET_EXCEPTION),
+                    e.getMessage(), e);
         }
+        
 
         try {
             if (exceptionOpeningSocket_ == null) {
Index: java/client/org/apache/derby/client/net/OpenSocketAction.java
===================================================================
--- java/client/org/apache/derby/client/net/OpenSocketAction.java	(revision 1406929)
+++ java/client/org/apache/derby/client/net/OpenSocketAction.java	(working copy)
@@ -27,13 +27,9 @@
 import javax.net.ssl.SSLSocket;
 
 public class OpenSocketAction implements java.security.PrivilegedExceptionAction {
-    private String server_;
-    private int port_;
     private int clientSSLMode_;
 
-    public OpenSocketAction(String server, int port, int clientSSLMode) {
-        server_ = server;
-        port_ = port;
+    public OpenSocketAction(int clientSSLMode) {
         clientSSLMode_ = clientSSLMode;
     }
 
@@ -64,7 +60,7 @@
             sf = SocketFactory.getDefault();
             break;
         }
-        return sf.createSocket(server_, port_);
+        return sf.createSocket();
     }
 
 }

                
> Iteratively creating and closing client connection yields java.net.BindException: Address
already in use: connect after many connections
> ----------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3108
>                 URL: https://issues.apache.org/jira/browse/DERBY-3108
>             Project: Derby
>          Issue Type: Bug
>          Components: Network Client, Network Server
>    Affects Versions: 10.4.1.3
>            Reporter: Kathey Marsden
>         Attachments: ConnLoop.java
>
>
> The attached program ConnLoop just creates client connections, uses them and then closes
them. After about 3000 connections I get the following error.  Also the memory usage seems
to be increasing rapidly.  This may be the cause of DERBY-2344.
> [C:/kmarsden/repro/DERBY-2344] java ConnLoop
> Apache Derby Network Server - 10.4.0.0 alpha - (578868M) started and ready to accept
connections on port 1527 at 2007-10
> -05 15:56:57.500 GMT
> 0:total memory: 5435392 free: 2749776 Fri Oct 05 08:57:09 PDT 2007
> 1000:total memory: 13701120 free: 10586720 Fri Oct 05 08:57:40 PDT 2007
> 2000:total memory: 20738048 free: 12805336 Fri Oct 05 08:58:09 PDT 2007
> 3000:total memory: 24006656 free: 11053832 Fri Oct 05 08:58:40 PDT 2007
> Exception in thread "main" java.sql.SQLNonTransientConnectionException: java.net.BindException
: Error connecting to ser
> ver localhost on port 1527 with message Address already in use: connect.
>         at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(SQLExceptionFactory40.java:70)
>         at org.apache.derby.client.am.SqlException.getSQLException(SqlException.java:362)
>         at org.apache.derby.jdbc.ClientDriver.connect(ClientDriver.java:149)
>         at java.sql.DriverManager.getConnection(DriverManager.java:582)
>         at java.sql.DriverManager.getConnection(DriverManager.java:207)
>         at ConnLoop.main(ConnLoop.java:18)
> Caused by: org.apache.derby.client.am.DisconnectException: java.net.BindException : Error
connecting to server localhost
>  on port 1527 with message Address already in use: connect.
>         at org.apache.derby.client.net.NetAgent.<init>(NetAgent.java:129)
>         at org.apache.derby.client.net.NetConnection.newAgent_(NetConnection.java:1086)
>         at org.apache.derby.client.am.Connection.<init>(Connection.java:349)
>         at org.apache.derby.client.net.NetConnection.<init>(NetConnection.java:209)
>         at org.apache.derby.client.net.NetConnection40.<init>(NetConnection40.java:77)
>         at org.apache.derby.client.net.ClientJDBCObjectFactoryImpl40.newNetConnection(ClientJDBCObjectFactoryImpl40.java
> :209)
>         at org.apache.derby.jdbc.ClientDriver.connect(ClientDriver.java:140)
>         ... 3 more
> Caused by: java.net.BindException: Address already in use: connect
>         at java.net.PlainSocketImpl.socketConnect(Native Method)
>         at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
>         at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
>         at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
>         at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
>         at java.net.Socket.connect(Socket.java:519)
>         at java.net.Socket.connect(Socket.java:469)
>         at java.net.Socket.<init>(Socket.java:366)
>         at java.net.Socket.<init>(Socket.java:179)
>         at javax.net.DefaultSocketFactory.createSocket(SocketFactory.java:196)
>         at org.apache.derby.client.net.OpenSocketAction.run(OpenSocketAction.java:62)
>         at java.security.AccessController.doPrivileged(Native Method)
>         at org.apache.derby.client.net.NetAgent.<init>(NetAgent.java:127)
>         ... 9 more
> [C:/kmarsden/repro/DERBY-2344]

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Mime
View raw message