enonic / xp

Enonic XP
https://enonic.com
GNU General Public License v3.0
201 stars 34 forks source link

Circular dependency between FragmentRender and RendererFactory #7890

Closed rymsha closed 4 years ago

rymsha commented 4 years ago

This is not a hypothetical issue. OSGi Circular Reference exception happens every now and then during startup. It is likely to happen when Elasticsearch gets active almost immediately during application startup. So it happens in clustered environment when other ES nodes are fully ready and cluster check succeeds immediately.

By looking at the code I can say that RendererFactory is a needless registry on top of OSGi Component registry and could be refactored in a way that it does not hold references to all Renderers.

rymsha commented 4 years ago
2020-02-19 13:50:00,634 ERROR ROOT - bundle org.apache.felix.scr:2.1.16 (11)Circular reference detected trying to get service [com.enonic.xp.portal.impl.rendering.Renderer]
 stack of references: ServiceReference: [com.enonic.xp.portal.impl.rendering.Renderer]
ServiceReference: [com.enonic.xp.portal.impl.rendering.RendererFactory]

java.lang.Exception: stack trace
        at org.apache.felix.scr.impl.ComponentRegistry.enterCreate(ComponentRegistry.java:485)
        at org.apache.felix.scr.impl.BundleComponentActivator.enterCreate(BundleComponentActivator.java:734)
        at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:881)
        at org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:348)
        at org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:248)
        at org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:350)
        at org.apache.felix.framework.Felix.getService(Felix.java:3954)
        at org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:450)
        at org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:86)
        at org.apache.felix.scr.impl.inject.BindParameters.getServiceObject(BindParameters.java:47)        at org.apache.felix.scr.impl.inject.methods.BindMethod.getServiceObject(BindMethod.java:664)
        at org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2308)
        at org.apache.felix.scr.impl.manager.DependencyManager$MultipleDynamicCustomizer.prebind(DependencyManager.java:411)
        at org.apache.felix.scr.impl.manager.DependencyManager.prebind(DependencyManager.java:1568)        at org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1029)
        at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:935)
        at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:900)
        at org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:348)
        at org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:248)
        at org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:350)
        at org.apache.felix.framework.Felix.getService(Felix.java:3954)
...
        at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:328)        at org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:335)        at com.enonic.xp.elasticsearch.impl.ElasticsearchCluster.registerClient(ElasticsearchCluster.java:158)
        at com.enonic.xp.elasticsearch.impl.ElasticsearchCluster.enable(ElasticsearchCluster.java:141)
        at java.base/java.lang.Iterable.forEach(Unknown Source)
        at com.enonic.xp.cluster.impl.ClusterManagerImpl.activateProviders(ClusterManagerImpl.java:91)
        at com.enonic.xp.cluster.impl.ClusterManagerImpl.checkProviders(ClusterManagerImpl.java:111)
        at com.enonic.xp.core.internal.concurrent.SimpleRecurringJobScheduler$WrappedRunnable.run(SimpleRecurringJobScheduler.java:77)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
        at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
        at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
        at java.base/java.lang.Thread.run(Unknown Source)
rymsha commented 4 years ago

It took me longer than I hoped. So, there is a "quickfix" which is still not the best and not so quick :(

rymsha commented 4 years ago

https://issues.apache.org/jira/browse/FELIX-5887