Content Loader is not thread safe
---------------------------------
Key: SLING-2114
URL: https://issues.apache.org/jira/browse/SLING-2114
Project: Sling
Issue Type: Bug
Components: JCR
Affects Versions: JCR ContentLoader 2.1.4
Reporter: Ray Davis
Priority: Critical
After deploying to a new quad-core system, we encountered a node loaded by one
bundle which contained file contents from a different bundle and different
path. After re-deployment, several bundles' content were missing altogether.
The log contained messages like:
27.06.2011 13:10:18.387 *ERROR* [FelixStartLevel]
org.apache.sling.jcr.contentloader.internal.ContentLoaderService bundleChanged:
Problem loading initial content of bundle
org.sakaiproject.nakamura.org.sakaiproject.nakamura.uxloader-myberkeley (8)
java.util.EmptyStackException
at java.util.Stack.peek(Stack.java:102)
at java.util.Stack.pop(Stack.java:84)
at
org.apache.sling.jcr.contentloader.internal.DefaultContentCreator.finishNode(DefaultContentCreator.java:470)
at
org.apache.sling.jcr.contentloader.internal.Loader.createFile(Loader.java:603)
at
org.apache.sling.jcr.contentloader.internal.Loader.handleFile(Loader.java:483)
at
org.apache.sling.jcr.contentloader.internal.Loader.installFromPath(Loader.java:425)
at
org.apache.sling.jcr.contentloader.internal.Loader.installFromPath(Loader.java:420)
at
org.apache.sling.jcr.contentloader.internal.Loader.installContent(Loader.java:279)
at
org.apache.sling.jcr.contentloader.internal.Loader.registerBundleInternal(Loader.java:172)
at
org.apache.sling.jcr.contentloader.internal.Loader.registerBundle(Loader.java:103)
at
org.apache.sling.jcr.contentloader.internal.ContentLoaderService.bundleChanged(ContentLoaderService.java:148)
and
27.06.2011 10:42:22.986 *ERROR* [FelixDispatchQueue]
org.apache.sling.jcr.contentloader.internal.Loader Cannot load initial content
for bundle org.sakaiproject.nakamura.user : Single-valued property can not be
set to an array of values:property
/var/notifications/search/sakai:propertyprovider
javax.jcr.ValueFormatException: Single-valued property can not be set to an
array of values:property /var/notifications/search/sakai:propertyprovider
at
org.apache.jackrabbit.core.PropertyImpl.checkSetValue(PropertyImpl.java:230)
at
org.apache.jackrabbit.core.PropertyImpl.setValue(PropertyImpl.java:690)
at org.apache.jackrabbit.core.NodeImpl.setProperty(NodeImpl.java:2413)
at org.apache.jackrabbit.core.NodeImpl.setProperty(NodeImpl.java:1555)
at org.apache.jackrabbit.core.NodeImpl.setProperty(NodeImpl.java:2134)
at org.apache.jackrabbit.core.NodeImpl.setProperty(NodeImpl.java:2156)
at
org.apache.sling.jcr.contentloader.internal.DefaultContentCreator.createProperty(DefaultContentCreator.java:416)
at
org.apache.sling.jcr.contentloader.internal.readers.JsonReader.createProperty(JsonReader.java:218)
at
org.apache.sling.jcr.contentloader.internal.readers.JsonReader.createNode(JsonReader.java:199)
at
org.apache.sling.jcr.contentloader.internal.readers.JsonReader.parse(JsonReader.java:159)
at
org.apache.sling.jcr.contentloader.internal.readers.JsonReader.parse(JsonReader.java:140)
at
org.apache.sling.jcr.contentloader.internal.Loader.createNode(Loader.java:543)
at
org.apache.sling.jcr.contentloader.internal.Loader.handleFile(Loader.java:470)
at
org.apache.sling.jcr.contentloader.internal.Loader.installFromPath(Loader.java:425)
at
org.apache.sling.jcr.contentloader.internal.Loader.installFromPath(Loader.java:420)
at
org.apache.sling.jcr.contentloader.internal.Loader.installFromPath(Loader.java:420)
at
org.apache.sling.jcr.contentloader.internal.Loader.installContent(Loader.java:279)
at
org.apache.sling.jcr.contentloader.internal.Loader.registerBundleInternal(Loader.java:172)
at
org.apache.sling.jcr.contentloader.internal.Loader.registerBundle(Loader.java:103)
at
org.apache.sling.jcr.contentloader.internal.ContentLoaderService.activate(ContentLoaderService.java:268)
The DefaultContentCreator object is written to be used by a single thread.
However, the Loader class stores it as an instance variable, and in turn the
ContentLoaderService stores the Loader as an instance variable. Apparently the
coder assumed that a SynchronousBundleListener is effectively single-threaded.
That assumption is wrong:
'Synchronous listeners get called "synchronously" on the same thread which
caused the event to occur. If two threads are performing actions which cause
bundle events to occur then synchronous listeners will be called (potentially
at the same "time") from the different threads which are causing the events to
occur. Bottom line, synchronous bundle listeners must be thread safe.'
- http://www.eclipse.org/forums/index.php?&t=msg&th=39802
--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira