You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@sling.apache.org by "Stefan Egli (JIRA)" <ji...@apache.org> on 2017/02/21 14:54:44 UTC

[jira] [Updated] (SLING-6542) MapEntries' concurrent session access broken

     [ https://issues.apache.org/jira/browse/SLING-6542?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Stefan Egli updated SLING-6542:
-------------------------------
    Attachment: SLING-6542.patch

Attached [^SLING-6542.patch] which moves the lock at the beginning of the three methods affected.

> 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
>
>         Attachments: SLING-6542.patch
>
>
> 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)