That was a very different situation, where a user of a service could need to 
fetch it for some last-second work before it disappears.  In this case, we see 
that the framework is delivering “MODIFIED” events to a service listener 
immediately after delivering an “UNREGISTERING’ event for the same service.  At 
this point all users of the service are supposed to have completely forgotten 
about it. IMNSHO there’s no way that can be interpreted reasonably.

thanks
david jencks

> On Apr 6, 2016, at 10:16 PM, Carsten Ziegeler <[email protected]> wrote:
> 
> We had a similar discussion in FELIX-5198 and came to the conclusion
> that the current behaviour regarding references is fine
> 
> Carsten
> 
> David Jencks wrote
>> Well, I got the idea for my suggestion from unregister:
>> 
>>    public void unregister()
>>    {
>>        synchronized (this)
>>        {
>>            if (!isValid() || m_isUnregistering)
>>            {
>>                throw new IllegalStateException("Service already 
>> unregistered.");
>>            }
>>            m_isUnregistering = true;
>>        }
>> …
>> 
>> 
>> I don’t have as many concerns about getReference since only the framework or 
>> the owner of the ServiceReferenceImpl should be calling it and I think there 
>> might be some use case for getting the ServiceReference  during the process 
>> of unregistration.
>> 
>> thanks
>> david jencks
>> 
>>> On Apr 6, 2016, at 2:09 PM, Pierre De Rop <[email protected]> wrote:
>>> 
>>> 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
>>>> 
>>>> 
>> 
>> 
> 
> 
> 
> -- 
> Carsten Ziegeler
> Adobe Research Switzerland
> [email protected]

Reply via email to