felix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "David Jencks (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (FELIX-5570) Immediate service component that provides a WeavingHook results in an NPE
Date Sat, 04 Mar 2017 21:46:45 GMT

    [ https://issues.apache.org/jira/browse/FELIX-5570?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15895890#comment-15895890
] 

David Jencks commented on FELIX-5570:
-------------------------------------

IIUC in Equinox currently the recursive class load loads the class with no weaving at all.
  I believe this will result in different results depending on if the DS service is immediate
or not.  If not, then the component instance used on the weaving of the first class load will
be discarded immediately, and the resulting component will have it’s class loaded using
a woven class (although the weaver won’t have been woven).  If the component is immediate,
I would expect that the component instance created for the recursive call to stick around,
so the class used will be the completely unwoven class.  I think  this difference in behavior
is a really bad idea.


> Immediate service component that provides a WeavingHook results in an NPE
> -------------------------------------------------------------------------
>
>                 Key: FELIX-5570
>                 URL: https://issues.apache.org/jira/browse/FELIX-5570
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services (SCR)
>    Affects Versions: scr-2.0.8
>            Reporter: Thomas Watson
>
> If you have an immediate service component that provides a WeavingHook service then an
NPE will result.  An example service component XML:
> <?xml version="1.0" encoding="UTF-8"?>
> <scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" enabled="true" immediate="true"
name="Test Patches Weaver">
>    <implementation class="test.patches.Weaver" />
>    <service>
>       <provide interface="org.osgi.framework.hooks.weaving.WeavingHook"/>
>    </service>
> </scr:component>
> If you deploy this bundle along with SCR 2.0.8 on Felix Framework 5.6.2 the following
NPE happens:
> ERROR: [Test Patches Weaver(0)] Error during instantiation of the implementation object
> java.lang.NullPointerException
> 	at org.apache.felix.scr.impl.manager.SingleComponentManager.createImplementationObject(SingleComponentManager.java:237)
> 	at org.apache.felix.scr.impl.manager.SingleComponentManager.createComponent(SingleComponentManager.java:109)
> 	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:906)
> 	at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:879)
> 	at org.apache.felix.scr.impl.manager.SingleComponentManager.getService(SingleComponentManager.java:823)
> 	at org.apache.felix.framework.ServiceRegistrationImpl.getFactoryUnchecked(ServiceRegistrationImpl.java:347)
> 	at org.apache.felix.framework.ServiceRegistrationImpl.getService(ServiceRegistrationImpl.java:247)
> 	at org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:350)
> 	at org.apache.felix.framework.Felix.getService(Felix.java:3720)
> 	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.transformClass(BundleWiringImpl.java:2359)
> 	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.findClass(BundleWiringImpl.java:2052)
> 	at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1518)
> 	at org.apache.felix.framework.BundleWiringImpl.access$200(BundleWiringImpl.java:79)
> 	at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1958)
> 	at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
> 	at org.apache.felix.framework.Felix.loadBundleClass(Felix.java:1925)
> 	at org.apache.felix.framework.BundleImpl.loadClass(BundleImpl.java:978)
> 	at org.apache.felix.scr.impl.manager.AbstractComponentManager.initDependencyManagers(AbstractComponentManager.java:976)
> 	at org.apache.felix.scr.impl.manager.AbstractComponentManager.collectDependencies(AbstractComponentManager.java:1003)
> 	at org.apache.felix.scr.impl.manager.SingleComponentManager.getServiceInternal(SingleComponentManager.java:859)
> 	at org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:749)
> 	at org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:675)
> 	at org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:430)
> 	at org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:657)
> 	at org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:341)
> 	at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:390)
> 	at org.apache.felix.scr.impl.Activator.access$200(Activator.java:54)
> 	at org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:265)
> 	at org.apache.felix.utils.extender.AbstractExtender.createExtension(AbstractExtender.java:254)
> 	at org.apache.felix.utils.extender.AbstractExtender.modifiedBundle(AbstractExtender.java:227)
> 	at org.apache.felix.utils.extender.AbstractExtender.addingBundle(AbstractExtender.java:187)
> 	at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:469)
> 	at org.osgi.util.tracker.BundleTracker$Tracked.customizerAdding(BundleTracker.java:415)
> 	at org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256)
> 	at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229)
> 	at org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
> 	at org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915)
> 	at org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834)
> 	at org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516)
> 	at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4562)
> 	at org.apache.felix.framework.Felix.activateBundle(Felix.java:2229)
> 	at org.apache.felix.framework.Felix.startBundle(Felix.java:2144)
> 	at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1371)
> 	at org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
> 	at java.lang.Thread.run(Thread.java:745)
> This is because SCR is invoking SingleComponentManager.getServiceInternal after registering
the WeavingHook service in order to get the service object for immediate activation.  This
ends up trying to load the test.patches.Weaver implementation class which then causes the
framework to look for WeavingHooks to call.  Which causes a recursive call back into SingleComponentManager.getServiceInternal
for the same service component which triggers another load of the implementation class.  Here
Felix framework detects a recursive class load for the same class name and returns null from
Bundle.loadClass() (Something I think is not correct, I think instead a CNFE must be thrown
or some other class loader LinkageError).
> This null class results in the above NPE.  I found this bug while running SCR on the
Equinox framework.  On Equinox a CNFE is thrown and logged by SCR and things seem to recover
from that but we are left with an error message in the log making it look like things are
not working.
> Both Equinox and Felix seem to detect the recursive class load that SCR is causing but
handle the situation slightly different.  In both cases I argue that SCR should avoid recursive
calls into SingleComponentManager.getServiceInternal for the same service component.
> The difficulty here is that SCR can depend on the framework to  avoid recursive calls
into its ServiceFactory because the specification mandates that (see org.osgi.framework.ServiceException.FACTORY_RECURSION).
 But here SCR is invoking SingleComponentManager.getServiceInternal itself and an internal
implementation detail of an immediate service component.  It seems that for this internal
call to SingleComponentManager.getServiceInternal something should be done to prevent recurse
calls so that this is consistent with how non-immediate components work.
> Also see https://bugs.eclipse.org/bugs/show_bug.cgi?id=512707



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Mime
View raw message