8003253: TEST_BUG: java/nio/channels/AsynchronousChannelGroup/Unbounded.java hang intermittently [win]
Chris Hegarty
chris.hegarty at oracle.com
Tue Nov 13 01:09:33 PST 2012
Looks fine to me Alan. Nasty race, good to catch and fix it early.
-Chris.
On 11/12/2012 07:55 PM, Alan Bateman wrote:
>
> Daniel Fuchs pinged me to say that this started failing intermittently
> him on Mac as soon as I pushed the change for 8003253.
>
> Mea culpa, the patch does bring a problem. At the end of the test the
> listener is closely and this the outstanding accept to fail with an
> AsycnhronousCloseException and so sets "failed" to true. This creates a
> race in that the main thread may see failed as true and fails the test.
>
> I've created a new bug for this, 8003285, and the patch to fix this is
> attached. If someone can review then we can sweep this one under the
> carpet before anyone else notices.
>
> -Alan
>
> diff --git
> a/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java
> b/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java
> --- a/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java
> +++ b/test/java/nio/channels/AsynchronousChannelGroup/Unbounded.java
> @@ -39,6 +39,9 @@
> // set to true if an I/O operation fails
> static volatile boolean failed;
>
> + // set to true when the test is done
> + static volatile boolean finished;
> +
> public static void main(String[] args) throws Exception {
> // all accepted connections are added to a queue
> final ArrayBlockingQueue<AsynchronousSocketChannel> queue =
> @@ -54,8 +57,10 @@
> listener.accept((Void)null, this);
> }
> public void failed(Throwable exc, Void att) {
> - failed = true;
> - System.err.println("accept failed: " + exc);
> + if (!finished) {
> + failed = true;
> + System.err.println("accept failed: " + exc);
> + }
> }
> });
> System.out.println("Listener created.");
> @@ -120,8 +125,11 @@
> // wait for all threads to reach the barrier
> System.out.println("Waiting for all threads to reach barrier");
> barrier.await();
> +
> + // finish up
> + finished = true;
> listener.close();
> if (failed)
> - throw new RuntimeException("I/O failed failed, see log for
> details");
> + throw new RuntimeException("I/O operation failed, see log
> for details");
> }
> }
>
More information about the nio-dev
mailing list