Robert Munteanu created SLING-7447:
--------------------------------------
Summary: Race condition in ThreadLocalCleaner initialization code
Key: SLING-7447
URL: https://issues.apache.org/jira/browse/SLING-7447
Project: Sling
Issue Type: Bug
Components: Commons
Affects Versions: Commons Threads 3.2.14
Reporter: Robert Munteanu
Assignee: Robert Munteanu
Fix For: Commons Threads 3.2.16
There is a race condition in the {{ThreadLocalCleaner}} initialization code
that can lead to the fields not being fully initialized when read.
The stack trace is similar to
{noformat}Exception in thread "sling-oak-observation-2"
java.lang.NullPointerException
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.copy(ThreadLocalCleaner.java:110)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.saveOldThreadLocals(ThreadLocalCleaner.java:230)
at
org.apache.sling.commons.threads.impl.ThreadLocalCleaner.<init>(ThreadLocalCleaner.java:155)
at
org.apache.sling.commons.threads.impl.ThreadPoolExecutorCleaningThreadLocals.beforeExecute(ThreadPoolExecutorCleaningThreadLocals.java:58)
at
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1139)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748){noformat}
Assume that two threads, _T1_ and _T2_ enter the constructor at more or less
the same time. The following events can then occur, leading to the above
invalid access
||T1||T2||
|check threadLocalsField (is null)| - |
|invoke initReflectionFields, load threadLocalsField| - |
| - | check threadLocalsField (is not null) |
| - | invoke saveOldTreadLocals |
| - | invoke copy |
At this point, the {{tableField}} field is null since {{initReflectionFields}}
has not yet completed, which leads to the above NPE.
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)