Code Review - 6957683 TEST_BUG: test/java/util/concurrent/ThreadPoolExecutor/Custom.java failing
Gary Adams
gary.adams at oracle.com
Tue Nov 22 15:57:53 UTC 2011
Revised webrev is available :
- removed the latch logic not required for main to worker thread coordination
- increased the timeout to allow service shutdown to 120 seconds
(will exit sooner if services finish)
- increased delay after service shutdown to ensure
thread counts will be updated.
http://cr.openjdk.java.net/~gadams/6957683/
On 11/21/11 09:33 PM, David Holmes wrote:
> Gary,
>
> On 22/11/2011 6:26 AM, Gary Adams wrote:
>> Not quite as sure about the internal timeouts in this regression test.
>>
>> Here's a proposed change that cranks up the timeouts. Since the test
>> harness defaults to 2 minutes there's no reason the service termination
>> should timeout more quickly. For the thread startup, I added a countdown
>> latch so the main thread waits til the worker threads have started.
>>
>> Also, after the service termination completes increased the delay to
>> ensure the thread count check will be accurate.
>>
>> http://cr.openjdk.java.net/~gadams/6957683/
>
> Sorry but I think my initial analysis of this problem was incorrect. The
> initial test failure reported 3 failed cases:
>
> 1 not equal to 0
> 11 not equal to 10
> 1 not equal to 0
>
> which corresponded to failures at the marked lines:
>
> public static void main(String[] args) throws Throwable {
> CustomTPE tpe = new CustomTPE();
> equal(tpe.getCorePoolSize(), threadCount);
> equal(countExecutorThreads(), 0);
> for (int i = 0; i < threadCount; i++)
> tpe.submit(new Runnable() { public void run() {}});
> equal(countExecutorThreads(), threadCount);
> equal(CustomTask.births.get(), threadCount);
> tpe.shutdown();
> tpe.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
> Thread.sleep(10);
> /*1*/ equal(countExecutorThreads(), 0);
>
> CustomSTPE stpe = new CustomSTPE();
> for (int i = 0; i < threadCount; i++)
> stpe.submit(new Runnable() { public void run() {}});
> equal(CustomSTPE.decorations.get(), threadCount);
> /*2*/ equal(countExecutorThreads(), threadCount);
> stpe.shutdown();
> stpe.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
> Thread.sleep(10);
> /*3/ equal(countExecutorThreads(), 0);
>
> System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
> if (failed > 0) throw new Exception("Some tests failed");
> }
>
> However, I think the failure at /*2*/ is actually seeing the same "extra"
> thread as reported at /*1*/. It could even be the same thread again at /*3*/
> but we have other independent failure cases for /*3*/.
>
> When we create the STPE each submit will create and start a worker thread
> until we reach the core pool size. These worker threads will be immediately
> visible to the countExecutorThreads() logic because it simply enumerates the
> ThreadGroup. I was mistakenly thinking that these threads need to actually get
> a chance to execute to become visible to the counting logic, but that is not
> the case.
>
> Consequently you can elide the change to add the latch and just leave the
> defensive timeouts on the awaitTermination with the increased sleep delays to
> give the worker threads a chance to really terminate.
>
> Sorry for sending you down the wrong path on this one.
>
> David
> -----
More information about the core-libs-dev
mailing list