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