[ 
https://issues.apache.org/jira/browse/DIRMINA-993?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Attila Kelemen updated DIRMINA-993:
-----------------------------------
    Description: 
Mina sometimes fails to connect to a remote TCP server when TCP_NODELAY is set 
for a `NioSocketConnector`.

{code:java}
    NioSocketConnector connector = new NioSocketConnector();
    try {
        connector.getSessionConfig().setTcpNoDelay(true);
        connector.setHandler(new IoHandlerAdapter());
        ConnectFuture future = connector.connect(new 
InetSocketAddress("localhost", myport));
        future.await();
        future.getSession();
    } finally {
        connector.dispose(true);
    }
{code}

The above code sometimes (rarely) fails with an exception (thrown by 
getSession()) with a (wrapped) "java.net.SocketException: Invalid argument: no 
further information" exception. The best way to reproduce the problem is to run 
the above code concurrently multiple times (e.g. as done by this method: 
https://github.com/kelemen/JTrim/blob/v1.7.3/jtrim-core/src/main/java/org/jtrim/concurrent/Tasks.java#L173).

I have also found a simplified JDK only code which reproduces the issue (more 
reliably) where the order of JDK calls are in the same order as Mina does:

{code:java}
    SocketChannel channel = SocketChannel.open();
    try {
        channel.configureBlocking(false);
        channel.connect(new InetSocketAddress("localhost", myport));

        channel.socket().setTcpNoDelay(true);
    } finally {
        channel.close();
    }
{code}

In the above code if `setTcpNoDelay` had been called before `connect` there is 
no exception thrown. Also worth noting, that it seems, that if 
`setTcpNoDelay(true)` is called again after a failure, the call seems to 
eventually succeed (possibly after many retries).

  was:
Mina sometimes fails to connect to a remote TCP server when TCP_NODELAY is set 
for a `NioSocketConnector`.

{code:java}
    NioSocketConnector connector = new NioSocketConnector();
    try {
        connector.getSessionConfig().setTcpNoDelay(true);
        connector.setHandler(new IoHandlerAdapter());
        ConnectFuture future = connector.connect(new 
InetSocketAddress("localhost", myport));
        future.await();
        future.getSession();
    } finally {
        connector.dispose(true);
    }
{code}

The above code sometimes (rarely) fails with an exception (thrown by 
getSession()) with a (wrapped) "java.net.SocketException: Invalid argument: no 
further information" exception. The best way to reproduce the problem is to run 
the above code concurrently multiple times (e.g. as done by this method: 
https://github.com/kelemen/JTrim/blob/v1.7.3/jtrim-core/src/main/java/org/jtrim/concurrent/Tasks.java#L173).

I have also found a simplified JDK only code which reproduces the issue (more 
reliably) where the order of JDK calls are in the same order as Mina does:

{code:java}
    SocketChannel channel = SocketChannel.open();
    try {
        channel = SocketChannel.open();
        channel.configureBlocking(false);
        channel.connect(new InetSocketAddress("localhost", myport));

        channel.socket().setTcpNoDelay(true);
    } finally {
        channel.close();
    }
{code}

In the above code if `setTcpNoDelay` had been called before `connect` there is 
no exception thrown. Also worth noting, that it seems, that if 
`setTcpNoDelay(true)` is called again after a failure, the call seems to 
eventually succeed (possibly after many retries).


> Connecting to server occasionally fails when using TCP_NODELAY
> --------------------------------------------------------------
>
>                 Key: DIRMINA-993
>                 URL: https://issues.apache.org/jira/browse/DIRMINA-993
>             Project: MINA
>          Issue Type: Bug
>          Components: Core
>    Affects Versions: 2.0.9
>         Environment: Windows (tested on Vista and 7)
>            Reporter: Attila Kelemen
>
> Mina sometimes fails to connect to a remote TCP server when TCP_NODELAY is 
> set for a `NioSocketConnector`.
> {code:java}
>     NioSocketConnector connector = new NioSocketConnector();
>     try {
>         connector.getSessionConfig().setTcpNoDelay(true);
>         connector.setHandler(new IoHandlerAdapter());
>         ConnectFuture future = connector.connect(new 
> InetSocketAddress("localhost", myport));
>         future.await();
>         future.getSession();
>     } finally {
>         connector.dispose(true);
>     }
> {code}
> The above code sometimes (rarely) fails with an exception (thrown by 
> getSession()) with a (wrapped) "java.net.SocketException: Invalid argument: 
> no further information" exception. The best way to reproduce the problem is 
> to run the above code concurrently multiple times (e.g. as done by this 
> method: 
> https://github.com/kelemen/JTrim/blob/v1.7.3/jtrim-core/src/main/java/org/jtrim/concurrent/Tasks.java#L173).
> I have also found a simplified JDK only code which reproduces the issue (more 
> reliably) where the order of JDK calls are in the same order as Mina does:
> {code:java}
>     SocketChannel channel = SocketChannel.open();
>     try {
>         channel.configureBlocking(false);
>         channel.connect(new InetSocketAddress("localhost", myport));
>         channel.socket().setTcpNoDelay(true);
>     } finally {
>         channel.close();
>     }
> {code}
> In the above code if `setTcpNoDelay` had been called before `connect` there 
> is no exception thrown. Also worth noting, that it seems, that if 
> `setTcpNoDelay(true)` is called again after a failure, the call seems to 
> eventually succeed (possibly after many retries).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to