[
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([email protected]/LoginContext.java:737)
at
javax.security.auth.login.LoginContext$4.run([email protected]/LoginContext.java:672)
at
javax.security.auth.login.LoginContext$4.run([email protected]/LoginContext.java:670)
at java.security.AccessController.doPrivileged([email protected]/Native
Method)
at
javax.security.auth.login.LoginContext.invokePriv([email protected]/LoginContext.java:670)
at
javax.security.auth.login.LoginContext.login([email protected]/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}
Right now {{WhiteboardUtils.getService()}} always create a new Tracker, which
is closed immediately after retrieving the requested service. But the
{{OsgiWhiteboard.track()}} documentation states:
{quote}
Returns a tracker for services of the given type. The returned tracker
is optimized for frequent Tracker#getServices() calls through
the use of a pre-compiled list of services that's atomically updated
whenever services are added, modified or removed.
{quote}
That means, we don't make use of this optimization here.
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.
{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([email protected]/LoginContext.java:737)
at
javax.security.auth.login.LoginContext$4.run([email protected]/LoginContext.java:672)
at
javax.security.auth.login.LoginContext$4.run([email protected]/LoginContext.java:670)
at java.security.AccessController.doPrivileged([email protected]/Native
Method)
at
javax.security.auth.login.LoginContext.invokePriv([email protected]/LoginContext.java:670)
at
javax.security.auth.login.LoginContext.login([email protected]/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}
Right now {{WhiteboardUtils.getService()}} always create a new Tracker, which
is closed immediately after retrieving the requested service. But the
{{OsgiWhiteboard.track()}} documentation states:
{quote}
Returns a tracker for services of the given type. The returned tracker
is optimized for frequent racker#getServices() calls through
the use of a pre-compiled list of services that's atomically updated
whenever services are added, modified or removed.
{quote}
That means, we don't make use of this optimization here.
> ExternalLoginModule: reduce the 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([email protected]/LoginContext.java:737)
> at
> javax.security.auth.login.LoginContext$4.run([email protected]/LoginContext.java:672)
> at
> javax.security.auth.login.LoginContext$4.run([email protected]/LoginContext.java:670)
> at
> java.security.AccessController.doPrivileged([email protected]/Native Method)
> at
> javax.security.auth.login.LoginContext.invokePriv([email protected]/LoginContext.java:670)
> at
> javax.security.auth.login.LoginContext.login([email protected]/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}
> Right now {{WhiteboardUtils.getService()}} always create a new Tracker, which
> is closed immediately after retrieving the requested service. But the
> {{OsgiWhiteboard.track()}} documentation states:
> {quote}
> Returns a tracker for services of the given type. The returned tracker
> is optimized for frequent Tracker#getServices() calls through
> the use of a pre-compiled list of services that's atomically updated
> whenever services are added, modified or removed.
> {quote}
> That means, we don't make use of this optimization here.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)