Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Circular dependency between FragmentRender and RendererFactory #7890

Closed
rymsha opened this issue Feb 19, 2020 · 3 comments
Closed

Circular dependency between FragmentRender and RendererFactory #7890

rymsha opened this issue Feb 19, 2020 · 3 comments
Assignees
Labels

Comments

@rymsha
Copy link
Contributor

rymsha commented Feb 19, 2020

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 rymsha added the Bug label Feb 19, 2020
@rymsha
Copy link
Contributor Author

rymsha commented Feb 20, 2020

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
Copy link
Contributor Author

rymsha commented Feb 20, 2020

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

@rymsha
Copy link
Contributor Author

rymsha commented Feb 20, 2020

@rymsha rymsha self-assigned this Feb 21, 2020
vbradnitski added a commit that referenced this issue Feb 25, 2020
Circular dependency between FragmentRender and RendererFactory #7890
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

2 participants