[ 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)