[
https://issues.apache.org/jira/browse/SLING-6261?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16174537#comment-16174537
]
Konrad Windszus edited comment on SLING-6261 at 9/26/17 5:10 PM:
-----------------------------------------------------------------
It seems the previous commit does not work under all circumstances. Sometimes
the following NPE within the IT can be observed (currently only happens on
Windows, but may happen at runtime as well)
{code}
Running
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest
Exception in thread "pool-9-thread-1" java.lang.NullPointerException
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.changed(ThreadLocalCleaner.java:140)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.diff(ThreadLocalCleaner.java:104)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.cleanup(ThreadLocalCleaner.java:79)
at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocals.afterExecute(ThreadPoolExecutorCleaningThreadLocals.java:63)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1150)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "pool-9-thread-2" java.lang.NullPointerException
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.changed(ThreadLocalCleaner.java:140)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.diff(ThreadLocalCleaner.java:104)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.cleanup(ThreadLocalCleaner.java:79)
at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocals.afterExecute(ThreadPoolExecutorCleaningThreadLocals.java:63)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1150)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.192 sec <<<
FAILURE! - in
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest
testThreadLocalBeingCleanedUp(org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest)
Time elapsed: 0.046 sec <<< FAILURE!
org.mockito.exceptions.verification.WantedButNotInvoked:
Wanted but not invoked:
listener.changed(
ADDED,
<any>,
java.lang.ThreadLocal@3632be31,
"test"
);
-> at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp(ThreadPoolExecutorCleaningThreadLocalsTest.java:60)
Actually, there were zero interactions with this mock.
at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp(ThreadPoolExecutorCleaningThreadLocalsTest.java:60)
Results :
Failed tests:
ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp:60
Wanted but not invoked:
listener.changed(
ADDED,
<any>,
java.lang.ThreadLocal@3632be31,
"test"
);
-> at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp(ThreadPoolExecutorCleaningThreadLocalsTest.java:60)
Actually, there were zero interactions with this mock.
Tests run: 6, Failures: 1, Errors: 0, Skipped: 0
{code}
To me it seems that the
{{org.apache.sling.commons.threads.impl.ThreadLocalCleaner.diff}} method does
not properly check for {{null}} Entries within the table field (which may
happen, either because of resizing or because the initial size is not
equivalent to the to the number of active ThreadLocal variables for that thread)
was (Author: kwin):
It seems the previous commit does not work under all circumstances. Sometimes
the following NPE within the IT can be observed (which may happen at runtime as
well)
{code}
Running
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest
Exception in thread "pool-9-thread-1" java.lang.NullPointerException
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.changed(ThreadLocalCleaner.java:140)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.diff(ThreadLocalCleaner.java:104)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.cleanup(ThreadLocalCleaner.java:79)
at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocals.afterExecute(ThreadPoolExecutorCleaningThreadLocals.java:63)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1150)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Exception in thread "pool-9-thread-2" java.lang.NullPointerException
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.changed(ThreadLocalCleaner.java:140)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.diff(ThreadLocalCleaner.java:104)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.cleanup(ThreadLocalCleaner.java:79)
at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocals.afterExecute(ThreadPoolExecutorCleaningThreadLocals.java:63)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1150)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.192 sec <<<
FAILURE! - in
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest
testThreadLocalBeingCleanedUp(org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest)
Time elapsed: 0.046 sec <<< FAILURE!
org.mockito.exceptions.verification.WantedButNotInvoked:
Wanted but not invoked:
listener.changed(
ADDED,
<any>,
java.lang.ThreadLocal@3632be31,
"test"
);
-> at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp(ThreadPoolExecutorCleaningThreadLocalsTest.java:60)
Actually, there were zero interactions with this mock.
at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp(ThreadPoolExecutorCleaningThreadLocalsTest.java:60)
Results :
Failed tests:
ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp:60
Wanted but not invoked:
listener.changed(
ADDED,
<any>,
java.lang.ThreadLocal@3632be31,
"test"
);
-> at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocalsTest.testThreadLocalBeingCleanedUp(ThreadPoolExecutorCleaningThreadLocalsTest.java:60)
Actually, there were zero interactions with this mock.
Tests run: 6, Failures: 1, Errors: 0, Skipped: 0
{code}
To me it seems that the
{{org.apache.sling.commons.threads.impl.ThreadLocalCleaner.diff}} method does
not properly check for {{null}} Entries within the table field (which may
happen, because those are WeakReferences themselfes and get invalidated
together with the key = ThreadLocal variable from the Thread class)
> ThreadExpiringThreadPool is relying on uncaught exceptions to kill threads
> --------------------------------------------------------------------------
>
> Key: SLING-6261
> URL: https://issues.apache.org/jira/browse/SLING-6261
> Project: Sling
> Issue Type: Improvement
> Components: Commons
> Affects Versions: Commons Threads 3.2.6
> Reporter: Konrad Windszus
> Assignee: Konrad Windszus
> Fix For: Commons Threads 3.2.10
>
> Attachments: SLING-6261-v01.patch
>
>
> In {{o.a.s.commons.threads.impl.ThreadExpiringThreadPool}} a
> {{RuntimeException}} with message "Kill old thread" is used in
> {{checkMaxThreadAge(final Thread thread)}}. This leads by default to a
> suspension of the thread when debugging with Eclipse (as since Neon JDT will
> suspend the thread on all uncaught exceptions). More information is available
> in
> http://stackoverflow.com/questions/6290470/eclipse-debugger-always-blocks-on-threadpoolexecutor-without-any-obvious-excepti.
> There should be a different mechanism to kill the thread than an uncaught
> exception.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)