Stefan Egli created SLING-6542:
----------------------------------

             Summary: MapEntries' concurrent session access broken
                 Key: SLING-6542
                 URL: https://issues.apache.org/jira/browse/SLING-6542
             Project: Sling
          Issue Type: Bug
          Components: ResourceResolver
    Affects Versions: Resource Resolver 1.5.0
            Reporter: Stefan Egli
            Priority: Critical
             Fix For: Resource Resolver 1.5.14


MapEntries uses a shared session. To avoid concurrent access it uses a Lock 
({{ReentrantLock}}) "{{initializing}}". With SLING-6131 (to be precise 
[here|https://github.com/apache/sling/commit/e6e0d2fe9f43c97abd3e71978c9d2952e409aeef])
 the order in which the lock is applied relative to refreshing however was 
inverted: the _refresh_ used to be _after_ the lock, with this change however 
it is now _before_. Which means that you can have a concurrent access to 
refresh and other session operations.

The following stacktrace illustrates a concurrent access:
* thread 1: {noformat}        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrItemResourceFactory.getItemOrNull(JcrItemResourceFactory.java:184)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrItemResourceFactory.createResource(JcrItemResourceFactory.java:96)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.getResource(JcrResourceProvider.java:300)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.AuthenticatedResourceProvider.getResource(AuthenticatedResourceProvider.java:135)
        at 
org.apache.sling.resourceresolver.impl.helper.ResourceResolverControl.getResource(ResourceResolverControl.java:224)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getAbsoluteResourceInternal(ResourceResolverImpl.java:1066)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getResourceInternal(ResourceResolverImpl.java:687)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.getResource(ResourceResolverImpl.java:641)
        at 
org.apache.sling.resourceresolver.impl.mapping.MapEntries.addResource(MapEntries.java:270)
        at 
org.apache.sling.resourceresolver.impl.mapping.MapEntries.onChange(MapEntries.java:718)
        at 
org.apache.sling.resourceresolver.impl.observation.BasicObservationReporter.reportChanges(BasicObservationReporter.java:210)
        at 
org.apache.sling.jcr.resource.internal.JcrResourceListener.onEvent(JcrResourceListener.java:155)
{noformat}
* thread 2: {noformat}        at 
org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate$WarningLock.lock(SessionDelegate.java:759)
        at 
org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate$WarningLock.lock(SessionDelegate.java:773)
        at 
org.apache.jackrabbit.oak.jcr.delegate.SessionDelegate.performVoid(SessionDelegate.java:269)
        at 
org.apache.jackrabbit.oak.jcr.session.SessionImpl.refresh(SessionImpl.java:432)
        at 
com.adobe.granite.repository.impl.CRX3SessionImpl.refresh(CRX3SessionImpl.java:213)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.refresh(JcrResourceProvider.java:516)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.AuthenticatedResourceProvider.refresh(AuthenticatedResourceProvider.java:89)
        at 
org.apache.sling.resourceresolver.impl.helper.ResourceResolverControl.refresh(ResourceResolverControl.java:155)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.refresh(ResourceResolverImpl.java:1340)
        at 
org.apache.sling.resourceresolver.impl.mapping.MapEntries.refreshResolverIfNecessary(MapEntries.java:636)
        at 
org.apache.sling.resourceresolver.impl.mapping.MapEntries.addResource(MapEntries.java:266)
        at 
org.apache.sling.resourceresolver.impl.mapping.MapEntries.onChange(MapEntries.java:718)
        at 
org.apache.sling.resourceresolver.impl.observation.BasicObservationReporter.reportChanges(BasicObservationReporter.java:210)
        at 
org.apache.sling.jcr.resource.internal.JcrResourceListener.onEvent(JcrResourceListener.java:155)
{noformat}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to