Hi Alexey,
When I considered the fix for implementing Future, it seemed to be so
complicated(I think that maybe, some APIs should be changed).
So I attached another solution for small changes of current sources.
I think this issue has two cases.
1. timed out --> connection established --> user calls future.cancel()
2. timed out --> user calls future.cancel() --> connection established
I think that the attached patch may resolve only case 2.
About case 1, user should consider some logic for closing the leak
connection .
---
final Future<Connection> future = connectorHandler.connect(serverAddr);
final Connection<SocketAddress> connection;
try {
connection = future.get(shortTimeout, timeunit);
} catch( ...) {
...
} catch(TimeoutException te) {
future.cancel(true);
// user should check the following.
connection = future.getResult();
if (connection != null) {
connection.closeSilently();
}
}
---
Maybe if we can implement new Future for connecting, user can call only
future.cancel() without additional consideration.
Any thoughts?
Thanks.
Regards,
Bongjae Chang
From: Oleksiy Stashok <oleksiy.stashok_at_oracle.com>
Reply-To: <dev_at_grizzly.java.net>
Date: Thu, 29 Mar 2012 11:59:16 +0200
To: <dev_at_grizzly.java.net>
Subject: Re: About connection leak
Hi Bonjae,
you found a bug.
IMO your expectation that future.cancel() has to close connection is
correct, but we've never implemented it.
Pls. file an issue (possible fix is also welcome :))
Thank you.
WBR,
Alexey.
On 03/29/2012 11:53 AM, Bongjae Chang wrote:
>
>
>
> Hi,
>
>
>
>
> When I used grizzly-memcached, I experienced connection leak when the trial of
> connecting a server was timed out.
>
>
>
>
>
> Connecting logic is simple.
>
> ---
>
> final Future<Connection> future = connectorHandler.connect(serverAddr);
>
> final Connection<SocketAddress> connection;
>
> try {
>
> connection = future.get(shortTimeout, timeunit);
>
> } catch( ...) {
>
> ...
>
> } catch(TimeoutException te) {
>
> // at this point, connection is null and I don't need to get a connection
> anymore. ---(1)
>
> }
>
> ---
>
>
>
>
> When it was timed out at (1), the connection is null. So I couldn't disconnect
> the connection.
>
> At (1), the only way which I could try to do was "future.cancel()" but the
> connection was not disconnected. If the connection will be established
> successfully after timeout, the connection will be alive forever.
>
>
>
>
> I would like to know how to disconnect the late connection after timeout in
> order to prevent the connection leak.
>
>
>
>
> Thanks.
>
>
>
>
> Regards,
>
> Bongjae Chang
>
>
>
>