dev@glassfish.java.net

Re: [FYI] More frequent BindException to occur

From: Jerome Dochez <Jerome.Dochez_at_Sun.COM>
Date: Fri, 30 Oct 2009 11:24:53 -0700

On Oct 30, 2009, at 11:17 AM, Jeanfrancois Arcand wrote:

> Salut,
>
> Jerome Dochez wrote:
>> Jean Francois, I think we have a problem...
>> I remember this created an enormous amount of pain in the past.
>
> Yes it will most probably.
>
>> There is something I don't quite understand, please clarify :
>> - you allow to bind to an existing port.
>> - on windows, if he port is used by tomcat
>
> ..if the port is occupied (not only a Java program)
>
> , you say nothing which seems
>> consistent with the above statement
>
> Indeed. On win32 we bind event if the port is currently in use
> (hence the issue).
>
>> - on unixes, you fail with SEVERE: doSelect IOException
>
> Yes, the JDK fail to bind.
>
>> java.net.BindException: Address already in use:
>> why do you fail on unix if you allow to bind to an existing port ?
>
> The JDK fail => Grizzly cannot control that part. In short, Win32
> allow you to blindly bind, where Unix don't, always checking the
> socket state whatever the state is. Win32 seems to allow you to bing
> on "temporary state".
>
>> can you also clarify also what is the messy part of doing something
>> special for win32.
>
> I can grab the OS via System.getProperty("os.name") and only turn of
> reuseAddress for win32. But that's messy as GF will not re-act the
> same based on the OS.
why would it be different in behavior ?

we would fail on both platform, on Windows because of your check, on
Unixes because the JDK binding will fail.

I am pretty sure that Solaris allows for multiple bindings to the same
port, in order to do multiplexing, which might be what windows
authorize too, no ?
I am wondering, should we make this setReuseAddress() a configurable
element, otherwise how can people leverage the underlying platform
features ?

jerome

>
> A+
>
> -- Jeanfrancois
>
>
>> thanks, jerome
>> On Oct 30, 2009, at 10:45 AM, Jeanfrancois Arcand wrote:
>>> Salut,
>>>
>>> in order to fix Issue 10690 for win32 users:
>>>
>>> * http://is.gd/4Il5u
>>>
>>> I've turned off the java.net.Socket.setReuseAddress()
>>>
>>> * http://is.gd/4Ilnw
>>>
>>> for all TCP listeners (8181,4848,8080,3700,7676) independent of
>>> the OS (will be a little messy if I do it only for win32)
>>>
>>> The effect you will notice once 1.9.18-f gets integrated is doing:
>>>
>>> java -jar glassfish.jar
>>> CTRL-C
>>> java -jar glassfish.jar
>>>
>>> will produce a BindException and GF will not start. The reason is
>>> the underlying OS may takes some times to release a TCP port, and
>>> since we no longer allow binding on an existing port, it can/will
>>> produce that exception.
>>>
>>> Unfortunately, it may breaks some existing tests who stop/start
>>> listeners too fast.
>>>
>>> A+
>>>
>>> -- Jeanfrancois
>>>
>>>
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net <mailto:dev-unsubscribe_at_glassfish.dev.java.net
>>> >
>>> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net <mailto:dev-help_at_glassfish.dev.java.net
>>> >
>>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe_at_glassfish.dev.java.net
> For additional commands, e-mail: dev-help_at_glassfish.dev.java.net
>