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

Joerg Hoh updated OAK-10578:
----------------------------
    Description: 
The OSGI Service Registry of Apache Felix uses synchronization to maintain its 
consistency. I have seen a number of cases, where this can lead to lock 
contention.

Now I have a case where code opens and closes a lot of JCR Sessions, which in 
the context of Adobe AEM/Sling can also trigger a number of access to this 
Registry. Not all cases are easy to fix, as there is other functionality (for 
example Sling Models) as well which is doing a lot of requests to that Service 
Registry.

{noformat}
   java.lang.Thread.State: BLOCKED (on object monitor)
        at 
org.apache.felix.framework.EventDispatcher.updateListener(EventDispatcher.java:397)
        - waiting to lock <0x0000000590bc43d8> (a 
org.apache.felix.framework.EventDispatcher)
        at 
org.apache.felix.framework.EventDispatcher.addListener(EventDispatcher.java:183)
        at org.apache.felix.framework.Felix.addServiceListener(Felix.java:3642)
        at 
org.apache.felix.framework.BundleContextImpl.addServiceListener(BundleContextImpl.java:259)
        at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:298)
        - locked <0x00000007c0e6bf40> (a 
org.osgi.util.tracker.ServiceTracker$Tracked)
        - locked <0x00000007c0e6bd08> (a org.osgi.util.tracker.ServiceTracker)
        at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:265)
        at 
org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:161)
        at 
org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:113)
        at 
org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:108)
        at 
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:185)
        at 
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:144)
        at 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModule.initialize(ExternalLoginModule.java:165)
        at 
org.apache.felix.jaas.boot.ProxyLoginModule.initialize(ProxyLoginModule.java:47)
        at 
javax.security.auth.login.LoginContext.invoke(java.base@11.0.19/LoginContext.java:737)
        at 
javax.security.auth.login.LoginContext$4.run(java.base@11.0.19/LoginContext.java:672)
        at 
javax.security.auth.login.LoginContext$4.run(java.base@11.0.19/LoginContext.java:670)
        at java.security.AccessController.doPrivileged(java.base@11.0.19/Native 
Method)
        at 
javax.security.auth.login.LoginContext.invokePriv(java.base@11.0.19/LoginContext.java:670)
        at 
javax.security.auth.login.LoginContext.login(java.base@11.0.19/LoginContext.java:581)
        at 
org.apache.jackrabbit.oak.core.ContentRepositoryImpl.login(ContentRepositoryImpl.java:170)
        at 
org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:297)
        at 
org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:240)
        at 
org.apache.jackrabbit.oak.jcr.session.SessionImpl.impersonate(SessionImpl.java:312)
        at 
com.adobe.granite.repository.impl.CRX3SessionImpl.impersonate(CRX3SessionImpl.java:161)
        at 
org.apache.sling.jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:205)
        at 
com.adobe.granite.repository.impl.SlingRepositoryImpl.createServiceSession(SlingRepositoryImpl.java:140)
        at 
org.apache.sling.jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:170)
        at 
org.apache.sling.jcr.base.AbstractSlingRepository2.loginService(AbstractSlingRepository2.java:383)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrProviderStateFactory.createProviderState(JcrProviderStateFactory.java:114)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:322)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:85)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.authenticate(ProviderManager.java:166)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.getOrCreateProvider(ProviderManager.java:89)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.authenticateAll(ProviderManager.java:133)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.createControl(ResourceResolverImpl.java:152)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.<init>(ResourceResolverImpl.java:113)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.<init>(ResourceResolverImpl.java:107)
        at 
org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolverInternal(CommonResourceResolverFactoryImpl.java:273)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getServiceResourceResolver(ResourceResolverFactoryImpl.java:89)
{noformat}

The 



  was:
The OSGI Service Registry of Apache Felix uses synchronization to maintain its 
consistency. I have seen a number of cases, where this can lead to lock 
contention.

Now I have a case where code opens and closes a lot of JCR Sessions, which in 
the context of Adobe AEM/Sling can also trigger a number of access to this 
Registry. Not all cases are easy to fix, as there is other functionality (for 
example Sling Models) as well which is doing a lot of requests to that Service 
Registry.

We should explore if it's possible to cache the resolved services and reuse 
them. That could increase the scalability especially under load.

{noformat}
   java.lang.Thread.State: BLOCKED (on object monitor)
        at 
org.apache.felix.framework.EventDispatcher.updateListener(EventDispatcher.java:397)
        - waiting to lock <0x0000000590bc43d8> (a 
org.apache.felix.framework.EventDispatcher)
        at 
org.apache.felix.framework.EventDispatcher.addListener(EventDispatcher.java:183)
        at org.apache.felix.framework.Felix.addServiceListener(Felix.java:3642)
        at 
org.apache.felix.framework.BundleContextImpl.addServiceListener(BundleContextImpl.java:259)
        at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:298)
        - locked <0x00000007c0e6bf40> (a 
org.osgi.util.tracker.ServiceTracker$Tracked)
        - locked <0x00000007c0e6bd08> (a org.osgi.util.tracker.ServiceTracker)
        at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:265)
        at 
org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:161)
        at 
org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:113)
        at 
org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:108)
        at 
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:185)
        at 
org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:144)
        at 
org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModule.initialize(ExternalLoginModule.java:165)
        at 
org.apache.felix.jaas.boot.ProxyLoginModule.initialize(ProxyLoginModule.java:47)
        at 
javax.security.auth.login.LoginContext.invoke(java.base@11.0.19/LoginContext.java:737)
        at 
javax.security.auth.login.LoginContext$4.run(java.base@11.0.19/LoginContext.java:672)
        at 
javax.security.auth.login.LoginContext$4.run(java.base@11.0.19/LoginContext.java:670)
        at java.security.AccessController.doPrivileged(java.base@11.0.19/Native 
Method)
        at 
javax.security.auth.login.LoginContext.invokePriv(java.base@11.0.19/LoginContext.java:670)
        at 
javax.security.auth.login.LoginContext.login(java.base@11.0.19/LoginContext.java:581)
        at 
org.apache.jackrabbit.oak.core.ContentRepositoryImpl.login(ContentRepositoryImpl.java:170)
        at 
org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:297)
        at 
org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:240)
        at 
org.apache.jackrabbit.oak.jcr.session.SessionImpl.impersonate(SessionImpl.java:312)
        at 
com.adobe.granite.repository.impl.CRX3SessionImpl.impersonate(CRX3SessionImpl.java:161)
        at 
org.apache.sling.jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:205)
        at 
com.adobe.granite.repository.impl.SlingRepositoryImpl.createServiceSession(SlingRepositoryImpl.java:140)
        at 
org.apache.sling.jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:170)
        at 
org.apache.sling.jcr.base.AbstractSlingRepository2.loginService(AbstractSlingRepository2.java:383)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrProviderStateFactory.createProviderState(JcrProviderStateFactory.java:114)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:322)
        at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:85)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.authenticate(ProviderManager.java:166)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.getOrCreateProvider(ProviderManager.java:89)
        at 
org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.authenticateAll(ProviderManager.java:133)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.createControl(ResourceResolverImpl.java:152)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.<init>(ResourceResolverImpl.java:113)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverImpl.<init>(ResourceResolverImpl.java:107)
        at 
org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolverInternal(CommonResourceResolverFactoryImpl.java:273)
        at 
org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getServiceResourceResolver(ResourceResolverFactoryImpl.java:89)
{noformat}




> Reduce number of access to OSGI registry
> ----------------------------------------
>
>                 Key: OAK-10578
>                 URL: https://issues.apache.org/jira/browse/OAK-10578
>             Project: Jackrabbit Oak
>          Issue Type: Task
>          Components: jcr
>            Reporter: Joerg Hoh
>            Priority: Major
>
> The OSGI Service Registry of Apache Felix uses synchronization to maintain 
> its consistency. I have seen a number of cases, where this can lead to lock 
> contention.
> Now I have a case where code opens and closes a lot of JCR Sessions, which in 
> the context of Adobe AEM/Sling can also trigger a number of access to this 
> Registry. Not all cases are easy to fix, as there is other functionality (for 
> example Sling Models) as well which is doing a lot of requests to that 
> Service Registry.
> {noformat}
>    java.lang.Thread.State: BLOCKED (on object monitor)
>         at 
> org.apache.felix.framework.EventDispatcher.updateListener(EventDispatcher.java:397)
>         - waiting to lock <0x0000000590bc43d8> (a 
> org.apache.felix.framework.EventDispatcher)
>         at 
> org.apache.felix.framework.EventDispatcher.addListener(EventDispatcher.java:183)
>         at 
> org.apache.felix.framework.Felix.addServiceListener(Felix.java:3642)
>         at 
> org.apache.felix.framework.BundleContextImpl.addServiceListener(BundleContextImpl.java:259)
>         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:298)
>         - locked <0x00000007c0e6bf40> (a 
> org.osgi.util.tracker.ServiceTracker$Tracked)
>         - locked <0x00000007c0e6bd08> (a org.osgi.util.tracker.ServiceTracker)
>         at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:265)
>         at 
> org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:161)
>         at 
> org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:113)
>         at 
> org.apache.jackrabbit.oak.osgi.OsgiWhiteboard.track(OsgiWhiteboard.java:108)
>         at 
> org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:185)
>         at 
> org.apache.jackrabbit.oak.spi.whiteboard.WhiteboardUtils.getService(WhiteboardUtils.java:144)
>         at 
> org.apache.jackrabbit.oak.spi.security.authentication.external.impl.ExternalLoginModule.initialize(ExternalLoginModule.java:165)
>         at 
> org.apache.felix.jaas.boot.ProxyLoginModule.initialize(ProxyLoginModule.java:47)
>         at 
> javax.security.auth.login.LoginContext.invoke(java.base@11.0.19/LoginContext.java:737)
>         at 
> javax.security.auth.login.LoginContext$4.run(java.base@11.0.19/LoginContext.java:672)
>         at 
> javax.security.auth.login.LoginContext$4.run(java.base@11.0.19/LoginContext.java:670)
>         at 
> java.security.AccessController.doPrivileged(java.base@11.0.19/Native Method)
>         at 
> javax.security.auth.login.LoginContext.invokePriv(java.base@11.0.19/LoginContext.java:670)
>         at 
> javax.security.auth.login.LoginContext.login(java.base@11.0.19/LoginContext.java:581)
>         at 
> org.apache.jackrabbit.oak.core.ContentRepositoryImpl.login(ContentRepositoryImpl.java:170)
>         at 
> org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:297)
>         at 
> org.apache.jackrabbit.oak.jcr.repository.RepositoryImpl.login(RepositoryImpl.java:240)
>         at 
> org.apache.jackrabbit.oak.jcr.session.SessionImpl.impersonate(SessionImpl.java:312)
>         at 
> com.adobe.granite.repository.impl.CRX3SessionImpl.impersonate(CRX3SessionImpl.java:161)
>         at 
> org.apache.sling.jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:205)
>         at 
> com.adobe.granite.repository.impl.SlingRepositoryImpl.createServiceSession(SlingRepositoryImpl.java:140)
>         at 
> org.apache.sling.jcr.base.AbstractSlingRepository2.createServiceSession(AbstractSlingRepository2.java:170)
>         at 
> org.apache.sling.jcr.base.AbstractSlingRepository2.loginService(AbstractSlingRepository2.java:383)
>         at 
> org.apache.sling.jcr.resource.internal.helper.jcr.JcrProviderStateFactory.createProviderState(JcrProviderStateFactory.java:114)
>         at 
> org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:322)
>         at 
> org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.authenticate(JcrResourceProvider.java:85)
>         at 
> org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.authenticate(ProviderManager.java:166)
>         at 
> org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.getOrCreateProvider(ProviderManager.java:89)
>         at 
> org.apache.sling.resourceresolver.impl.providers.stateful.ProviderManager.authenticateAll(ProviderManager.java:133)
>         at 
> org.apache.sling.resourceresolver.impl.ResourceResolverImpl.createControl(ResourceResolverImpl.java:152)
>         at 
> org.apache.sling.resourceresolver.impl.ResourceResolverImpl.<init>(ResourceResolverImpl.java:113)
>         at 
> org.apache.sling.resourceresolver.impl.ResourceResolverImpl.<init>(ResourceResolverImpl.java:107)
>         at 
> org.apache.sling.resourceresolver.impl.CommonResourceResolverFactoryImpl.getResourceResolverInternal(CommonResourceResolverFactoryImpl.java:273)
>         at 
> org.apache.sling.resourceresolver.impl.ResourceResolverFactoryImpl.getServiceResourceResolver(ResourceResolverFactoryImpl.java:89)
> {noformat}
> The 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to