Thanks for the fix, The test is now running seamlessly. So, regarding a possible bug in the framework, you suggest that the framework ServiceRegistrationImpl.setPropertie() method should throw an IllegalStateException not only when the service has already been unregistered, but also when the service is being unregistering. But in this case, should the same be done for the other ServiceRegistration methods, like ServiceRegistrationImpl.unregister(), ServiceRegistrationImpl.getReference() ?
What other people are thinking ? Anyway, thanks for the patch. /Pierre On Wed, Apr 6, 2016 at 6:15 AM, David Jencks <[email protected] > wrote: > Thanks for pointing this out. I fixed it in r1737908. > > I think there might be a bug in the felix framework, as the stack trace > indicates that setProperties is called and propagated to DS components > after DS called the ServiceRegistration.unregister() method (but before it > returned). While 10.1.30.2 indicates setProperties throws > "IllegalStateException– If this ServiceRegistration object has already > been unregistered.” I rather think this only makes sense to interpret > “has already been unregistered” to mean “the framework has started > unregistering” rather than “the framework has finished unregistering”. > > How about (in ServiceRegistrationImpl) > > public void setProperties(Dictionary dict) > { > Map oldProps; > synchronized (this) > { > // Make sure registration is valid. > if (!isValid() || m_isUnregistering) // <<<<<<< add || > m_isUnregistering > { > throw new IllegalStateException( > "The service registration is no longer valid."); > } > // Remember old properties. > oldProps = m_propMap; > // Set the properties. > initializeProperties(dict); > } > // Tell registry about it. > m_registry.servicePropertiesModified(this, new > MapToDictionary(oldProps)); > } > > ? > This is sort of the inverse situation 5213 fixes. > > Thoughts? > > thanks > david jencks > > > > > On Mar 31, 2016, at 2:49 PM, Pierre De Rop <[email protected]> > wrote: > > > > Hi; > > > > After the recent commit made for FELIX-5213 in revision 1737170, I notice > > that the MutablePropertiesTest.java is now logging the following log: > > > > > org.ops4j.pax.exam.invoker.junit[org.ops4j.pax.exam.invoker.junit.internal.ContainerTestRunner] > > : running test_mutable_properties_consumer in reactor > > log level: 1 D=23:42:15,692 T=Thread[FelixDispatchQueue,5,main]: > > FrameworkEvent: ERROR > > org.osgi.framework.ServiceException: ServiceFactory.getService() resulted > > in a cycle. > > at > > > org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:302) > > at org.apache.felix.framework.Felix.getService(Felix.java:3671) > > at > > > org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:472) > > at > > > org.apache.felix.scr.impl.manager.SingleRefPair.getServiceObject(SingleRefPair.java:72) > > at > > > org.apache.felix.scr.impl.helper.BindMethod.getServiceObject(BindMethod.java:646) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager.getServiceObject(DependencyManager.java:2137) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager.doInvokeBindMethod(DependencyManager.java:1651) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager.invokeBindMethod(DependencyManager.java:1636) > > at > > > org.apache.felix.scr.impl.manager.SingleComponentManager.invokeBindMethod(SingleComponentManager.java:371) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager$SingleDynamicCustomizer.addedService(DependencyManager.java:731) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager$SingleDynamicCustomizer.addedService(DependencyManager.java:700) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1215) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerAdded(ServiceTracker.java:1136) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.trackAdding(ServiceTracker.java:945) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.track(ServiceTracker.java:881) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1167) > > at > > > org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:124) > > at > > > org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:987) > > at > > > org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:838) > > at > > > org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:545) > > at > > org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4547) > > at org.apache.felix.framework.Felix.access$000(Felix.java:106) > > at > org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:436) > > at > > > org.apache.felix.framework.ServiceRegistry.servicePropertiesModified(ServiceRegistry.java:535) > > at > > > org.apache.felix.framework.ServiceRegistrationImpl.setProperties(ServiceRegistrationImpl.java:127) > > at > > > org.apache.felix.scr.impl.manager.SingleComponentManager.updateServiceRegistration(SingleComponentManager.java:548) > > at > > > org.apache.felix.scr.impl.manager.SingleComponentManager.setServiceProperties(SingleComponentManager.java:499) > > at > > > org.apache.felix.scr.impl.manager.AbstractComponentManager.setServiceProperties(AbstractComponentManager.java:1370) > > at > > > org.apache.felix.scr.impl.manager.SingleComponentManager.disposeImplementationObject(SingleComponentManager.java:347) > > at > > > org.apache.felix.scr.impl.manager.SingleComponentManager.deleteComponent(SingleComponentManager.java:158) > > at > > > org.apache.felix.scr.impl.manager.SingleComponentManager.ungetService(SingleComponentManager.java:947) > > at > > > org.apache.felix.scr.impl.manager.SingleComponentManager.ungetService(SingleComponentManager.java:936) > > at > > > org.apache.felix.framework.ServiceRegistrationImpl.ungetFactoryUnchecked(ServiceRegistrationImpl.java:384) > > at > > > org.apache.felix.framework.ServiceRegistrationImpl.ungetService(ServiceRegistrationImpl.java:282) > > at > > > org.apache.felix.framework.ServiceRegistry.ungetService(ServiceRegistry.java:431) > > at org.apache.felix.framework.Felix.ungetService(Felix.java:3683) > > at > > > org.apache.felix.framework.BundleContextImpl.ungetService(BundleContextImpl.java:485) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager$AbstractCustomizer.ungetService(DependencyManager.java:235) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager$SingleDynamicCustomizer.removedService(DependencyManager.java:843) > > at > > > org.apache.felix.scr.impl.manager.DependencyManager$SingleDynamicCustomizer.removedService(DependencyManager.java:700) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1241) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.customizerRemoved(ServiceTracker.java:1136) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$AbstractTracked.untrack(ServiceTracker.java:996) > > at > > > org.apache.felix.scr.impl.manager.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:1175) > > at > > > org.apache.felix.scr.impl.BundleComponentActivator$ListenerInfo.serviceChanged(BundleComponentActivator.java:124) > > at > > > org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:987) > > at > > > org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:838) > > at > > > org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:545) > > at > > org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4547) > > at org.apache.felix.framework.Felix.access$000(Felix.java:106) > > at > org.apache.felix.framework.Felix$1.serviceChanged(Felix.java:436) > > at > > > org.apache.felix.framework.ServiceRegistry.unregisterService(ServiceRegistry.java:165) > > at > > > org.apache.felix.framework.ServiceRegistrationImpl.unregister(ServiceRegistrationImpl.java:140) > > at > > > org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:879) > > at > > > org.apache.felix.scr.impl.manager.AbstractComponentManager$3.unregister(AbstractComponentManager.java:847) > > at > > > org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:139) > > at > > > org.apache.felix.scr.impl.manager.AbstractComponentManager.unregisterService(AbstractComponentManager.java:921) > > at > > > org.apache.felix.scr.impl.manager.AbstractComponentManager.doDeactivate(AbstractComponentManager.java:774) > > at > > > org.apache.felix.scr.impl.manager.AbstractComponentManager.deactivateInternal(AbstractComponentManager.java:757) > > at > > > org.apache.felix.scr.impl.manager.AbstractComponentManager.dispose(AbstractComponentManager.java:550) > > at > > > org.apache.felix.scr.impl.config.ConfigurableComponentHolder.disposeComponents(ConfigurableComponentHolder.java:706) > > at > > > org.apache.felix.scr.impl.BundleComponentActivator.dispose(BundleComponentActivator.java:544) > > at > > org.apache.felix.scr.impl.Activator.disposeComponents(Activator.java:450) > > at > org.apache.felix.scr.impl.Activator.access$300(Activator.java:51) > > at > > > org.apache.felix.scr.impl.Activator$ScrExtension.destroy(Activator.java:304) > > at > > > org.apache.felix.utils.extender.AbstractExtender$2.run(AbstractExtender.java:290) > > at > > java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) > > at java.util.concurrent.FutureTask.run(FutureTask.java:262) > > at > > > org.apache.felix.utils.extender.AbstractExtender.destroyExtension(AbstractExtender.java:312) > > at > > > org.apache.felix.utils.extender.AbstractExtender.bundleChanged(AbstractExtender.java:186) > > at > > > org.apache.felix.framework.util.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:913) > > at > > > org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:834) > > at > > > org.apache.felix.framework.util.EventDispatcher.fireBundleEvent(EventDispatcher.java:516) > > at > org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4531) > > at org.apache.felix.framework.Felix.stopBundle(Felix.java:2597) > > at > org.apache.felix.framework.Felix.uninstallBundle(Felix.java:2709) > > at > > org.apache.felix.framework.BundleImpl.uninstall(BundleImpl.java:1044) > > at > > > org.apache.felix.scr.integration.ComponentTestBase.tearDown(ComponentTestBase.java:220) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.lang.reflect.Method.invoke(Method.java:606) > > at > > > org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) > > at > > > org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) > > at > > > org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) > > at > > > org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:33) > > at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) > > at > > > org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) > > at > > > org.ops4j.pax.exam.invoker.junit.internal.ContainerTestRunner.runChild(ContainerTestRunner.java:67) > > at > > > org.ops4j.pax.exam.invoker.junit.internal.ContainerTestRunner.runChild(ContainerTestRunner.java:37) > > at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) > > at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) > > at > org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) > > at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) > > at > org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) > > at org.junit.runners.ParentRunner.run(ParentRunner.java:309) > > at org.junit.runner.JUnitCore.run(JUnitCore.java:160) > > at org.junit.runner.JUnitCore.run(JUnitCore.java:138) > > at > > > org.ops4j.pax.exam.invoker.junit.internal.JUnitProbeInvoker.invokeViaJUnit(JUnitProbeInvoker.java:123) > > at > > > org.ops4j.pax.exam.invoker.junit.internal.JUnitProbeInvoker.findAndInvoke(JUnitProbeInvoker.java:96) > > at > > > org.ops4j.pax.exam.invoker.junit.internal.JUnitProbeInvoker.call(JUnitProbeInvoker.java:72) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.lang.reflect.Method.invoke(Method.java:606) > > at > > > org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.invokeMethodOnService(RemoteFrameworkImpl.java:420) > > at > > > org.ops4j.pax.swissbox.framework.RemoteFrameworkImpl.invokeMethodOnService(RemoteFrameworkImpl.java:393) > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > at > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) > > at > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) > > at java.lang.reflect.Method.invoke(Method.java:606) > > at > > sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:322) > > at sun.rmi.transport.Transport$2.run(Transport.java:202) > > at sun.rmi.transport.Transport$2.run(Transport.java:199) > > at java.security.AccessController.doPrivileged(Native Method) > > at sun.rmi.transport.Transport.serviceCall(Transport.java:198) > > at > > sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:567) > > at > > > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828) > > at > > > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.access$400(TCPTransport.java:619) > > at > > > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:684) > > at > > > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$1.run(TCPTransport.java:681) > > at java.security.AccessController.doPrivileged(Native Method) > > at > > > sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:681) > > at > > > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > > at > > > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > > at java.lang.Thread.run(Thread.java:745) > > > > > > Is this error expected ? > > > > thank you; > > > > regards; > > /Pierre > >
