RFR 8008223: java/net/BindException/Test.java fails rarely

Chris Hegarty chris.hegarty at oracle.com
Thu Feb 14 06:43:47 PST 2013


Webrev:
   http://cr.openjdk.java.net/~chegar/8008223/webrev.00/webrev/

This test has been around a long time, and rarely fails, but has had 
several bugs closed as 'not reproducible' marked against it.

The test tries to verify that a BindException is thrown, or not thrown, 
in the appropriate circumstances. It does this by creating/binding a 
first socket to a specific socket address, then attempting to bind a 
second socket to possibly the same address. If the second socket 
attempts to bind to the same address as the first socket, then a 
BindException is expected to be thrown.

The problem appears to be an issue with the test itself. A local 
variable holds a reference to the first socket. This local variable is 
never accessed again within its scope (or elsewhere), therefore becomes 
instantly unreachable and eligible for collection by the GC. The second 
socket, if binding with the same address, is expected to throw 
BindException, but the first socket is no longer guaranteed to be live 
and therefore the address is not guaranteed to be unbindable.

I managed to reproduce the failure above, relatively consistently, by 
inserting 'System.runFinalization(); System.gc();' between the 
creation/binding of the first socket and the binding of the second one. 
This gives weight to the above analysis.

The solution is to simply add some trivial statement that references the 
first socket, after the second one is bound. This will ensure that the 
first socket remains reachable until after the second socket attempts to 
bind.

-Chris.



More information about the net-dev mailing list