Felix,

Would it be possible for you to send me a jar file containing the fix? I
dont have a source build at the moment, so it will be easier for me if you
could send me the jar.


My understanding (I may be totally wrong) was that that during Felix
shutdown, all the bundles were being stopped causing all the services from
the bundles to be unregistered. When one of the services got unregistered, a
component (ComponentA) which had a reference to this service is reactivated
(Stack trace 1). This causes the ComponentActorThread to call
deactivateInternal for ComponentA (Stack trace 2) resulting in its services
being unregistered. Meanwhile the thread doing the shutdown continues to
stop all bundles including the bundle which contains ComponentA,
unregistering services from ComponentA in a different thread (Stack trace
3).

Stack trace 1 and 3 are from the same thread and 1 preceeds 3. Stack trace 2
and 3 are on different threads and can occur simultaneously causing an
exception.


*Stack trace 1:*
  Thread [FelixStartLevel] (Suspended (breakpoint at line 711 in
DependencyManager))
        DependencyManager.removedService(ServiceReference) line: 711
        DependencyManager.serviceChanged(ServiceEvent) line: 109
        EventDispatcher.invokeServiceListenerCallback(Bundle, EventListener,
Filter, Object, EventObject) line: 735
        EventDispatcher.fireEventImmediately(Logger, int, Object[],
EventObject) line: 593
        EventDispatcher.fireServiceEvent(ServiceEvent) line: 525
        Felix.fireServiceEvent(ServiceEvent) line: 3510
        Felix.access$000(Felix, ServiceEvent) line: 36
        Felix$1.serviceChanged(ServiceEvent) line: 576
        ServiceRegistry.fireServiceChanged(ServiceEvent) line: 435
        ServiceRegistry.unregisterService(Bundle, ServiceRegistration) line:
86
        ServiceRegistrationImpl.unregister() line: 99

ImmediateComponentManager(AbstractComponentManager).unregisterComponentService()
line: 503

ImmediateComponentManager(AbstractComponentManager).deactivateInternal()
line: 369

ImmediateComponentManager(AbstractComponentManager).disableInternal() line:
390

ImmediateComponentManager(AbstractComponentManager).disposeInternal() line:
419
        ImmediateComponentManager(AbstractComponentManager).dispose() line:
224
        BundleComponentActivator.dispose() line: 229
        Activator.disposeComponents(Bundle) line: 230
        Activator.bundleChanged(BundleEvent) line: 161
        EventDispatcher.invokeBundleListenerCallback(Bundle, EventListener,
EventObject) line: 660
        EventDispatcher.fireEventImmediately(Logger, int, Object[],
EventObject) line: 589
        EventDispatcher.fireBundleEvent(BundleEvent) line: 503
        Felix.fireBundleEvent(int, Bundle) line: 3499
        Felix._stopBundle(FelixBundle, boolean) line: 1901
        Felix.stopBundle(FelixBundle, boolean) line: 1866
        Felix.setFrameworkStartLevel(int) line: 1080
        StartLevelImpl.run() line: 258
        Thread.run() line: 803

*Stack trace 2:*
  Thread [SCR Component Actor] (Suspended (breakpoint at line 99 in
ServiceRegistrationImpl))
        ServiceRegistrationImpl.unregister() line: 99

ImmediateComponentManager(AbstractComponentManager).unregisterComponentService()
line: 503

ImmediateComponentManager(AbstractComponentManager).deactivateInternal()
line: 369
        AbstractComponentManager.access$200(AbstractComponentManager) line:
55
        AbstractComponentManager$3.run() line: 176
        ComponentActorThread.run() line: 81

*Stack trace 3:*
  Thread [FelixStartLevel] (Suspended (breakpoint at line 99 in
ServiceRegistrationImpl))
        ServiceRegistrationImpl.unregister() line: 99
        ServiceRegistry.unregisterServices(Bundle) line: 119
        Felix._stopBundle(FelixBundle, boolean) line: 1946
        Felix.stopBundle(FelixBundle, boolean) line: 1866
        Felix.setFrameworkStartLevel(int) line: 1080
        StartLevelImpl.run() line: 258
        Thread.run() line: 803



Thank you...

Regards,

Rajini


On 8/22/07, Felix Meschberger <[EMAIL PROTECTED]> wrote:
>
> Hi Rajini,
>
> I have to admit, that I am not 100% sure, what is going on. But this is
> what I suppose:
>
> Some component has to be activated resulting thus (probably) calling the
> ImmediateComponentManager.createObjectInstance method (most probably
> asynchronously). Most probably this fails and results in the
> AbstractComponentManager.deactivate() method being called. This method
> (asynchronously again, but actually queued, so definitively later) tries
> to unregister a service which may or may not be registered...
>
> At the "same time" (whatever that means :-) ) the Bundle containing the
> component is being stopped (probably due to framework shutdown, doesn't
> matter, actually)  and the framework has already unregistered the
> service.
>
> The problem here is, that the createObjectInstance method should not
> call the deactivate method for asynchronous deactivation. In fact, no
> real deactivation is needed anyway, so I rewrote that part of the
> implementation.
>
> I will test this code with my tests further. Could you also test your
> testcase again ? Thanks. I did not deploy a new snapshot yet, so you
> will have to build it yourself. If this is not possible for you, please
> let me know.
>
> Regards
> Felix
>
> Am Montag, den 20.08.2007, 15:18 +0100 schrieb Rajini Sivaram:
> > Hello,
> >
> > One of my testcases intermittently throws an exception during shutdown.
> I
> > have managed to recreate the exception under a debugger, and it shows
> two
> > threads trying to unregister the same service. The test fails only when
> > declarative services are used. I am using Felix 1.0.0. The test uses
> > multiple versions of a bundle, but I am not sure if that has anything to
> do
> > with the exception.
> >
> > The exception thrown is:
> >
> >     --- Exception with component : Unexpected problem executing task ---
> >     java.lang.IllegalStateException: Service already unregistered.
> >         at org.apache.felix.framework.ServiceRegistrationImpl.unregister
> (
> > ServiceRegistrationImpl.java:105)
> >         at
> > org.apache.felix.scr.AbstractComponentManager.unregisterComponentService
> (
> > AbstractComponentManager.java:503)
> >         at
> org.apache.felix.scr.AbstractComponentManager.deactivateInternal(
> > AbstractComponentManager.java:369)
> >         at org.apache.felix.scr.AbstractComponentManager.access$200(
> > AbstractComponentManager.java:55)
> >         at org.apache.felix.scr.AbstractComponentManager$3.run(
> > AbstractComponentManager.java:176)
> >         at org.apache.felix.scr.ComponentActorThread.run(
> > ComponentActorThread.java:81)
> >
> > Here is the stack trace of the two threads under the debugger (both are
> > using the same object):
> >
> >                 Thread [FelixStartLevel] (Suspended (breakpoint at line
> 97
> > in ServiceRegistrationImpl))
> >                         ServiceRegistrationImpl.unregister() line: 97
> >                         ServiceRegistry.unregisterServices(Bundle) line:
> 119
> >                         Felix._stopBundle(FelixBundle, boolean) line:
> 1946
> >                         Felix.stopBundle(FelixBundle, boolean) line:
> 1866
> >                         Felix.setFrameworkStartLevel(int) line: 1080
> >                         StartLevelImpl.run() line: 258
> >                         Thread.run() line: 803
> >                 Thread [SCR Component Actor] (Suspended (breakpoint at
> line
> > 97 in ServiceRegistrationImpl))
> >                         ServiceRegistrationImpl.unregister() line: 97
> >
> >
> ImmediateComponentManager(AbstractComponentManager).unregisterComponentService()
> > line: 503
> >
> > ImmediateComponentManager(AbstractComponentManager).deactivateInternal()
> > line: 369
> >
> > AbstractComponentManager.access$200(AbstractComponentManager)
> > line: 55
> >                         AbstractComponentManager$3.run() line: 176
> >                         ComponentActorThread.run() line: 81
> >
> >
> > The exception thrown is the IllegalStateException from
> >     public void unregister()
> >     {
> >         if (m_svcObj != null)
> >         {
> >             m_registry.unregisterService(m_bundle, this);
> >             m_svcObj = null;
> >             m_factory = null;
> >         }
> >         else
> >         {
> >            * throw new IllegalStateException("Service already
> > unregistered.");
> > *        }
> >     }
> >
> >
> >
> > Thank you...
> >
> > Regards,
> >
> > Rajini
>
>

Reply via email to