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

        

Reply via email to