Hi Rajini,
Am Donnerstag, den 23.08.2007, 14:26 +0100 schrieb Rajini Sivaram:
> I have tried the new SCR.jar, and that also results in the same exception.
>From your last message, this is about, what I expected....
I suspect - from your observations - that a component which is re-activated due
to a service stop,
should actually not be activated again (stopping is fine, though). But this is
just a wild guess.
Is the component you are trying to reactivate defined to have "static" (in
contrast to dynamic)
references to other services ?
> How do I get the log/trace from SCR?
SCR logs to the LogService if available or to stdout for normal messages
and stderr for error messages. By default only error messages are
written. To also get informational messages, you will have to set the
"ds.showtrace" property to "true". You may do this by specifying
ds.showtrace = true
in the config.properties file when starting Felix.
If you could provide me with the stacktrace containing the
"ImmediateComponentManager(AbstractComponentManager).deactivateInternal()"
method call, this would also be helpful.
Thanks.
Regards
Felix
> Thank you...
>
> Regards,
>
> Rajini
>
>
> On 8/23/07, Felix Meschberger <[EMAIL PROTECTED]> wrote:
> >
> > Hi Rajini,
> >
> > One more thing: Having logging output from the SCR (going through the
> > LogService) would also be helpful.
> >
> > Regards
> > Felix
> >
> > Am Donnerstag, den 23.08.2007, 10:35 +0100 schrieb Rajini Sivaram:
> > > 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
> > > >
> > > >
> >
> >