Closed rymsha closed 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)
It took me longer than I hoped. So, there is a "quickfix" which is still not the best and not so quick :(
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.