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