[
https://issues.apache.org/jira/browse/SLING-2114?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13056587#comment-13056587
]
Ray Davis commented on SLING-2114:
----------------------------------
I got a working deployment by declaring Loader installContent() "synchronized".
But it might be better to drop the instance variable and create a
DefaultContentCreator when needed.
> 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