[ 
https://issues.apache.org/jira/browse/FELIX-341?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12521828
 ] 

Felix Meschberger commented on FELIX-341:
-----------------------------------------

I cannot exactly tell, what is going on here. Telling from the code, the 
deactivate() method, which asynchronously calls the deactivateInternal() 
method, is only called from the createImplementationObject method to 
"deactivate" the component if activation fails. It is of course not a good 
thing, that this method calls component deactivation asynchronously. Instead 
the component should be marked inactive immediately (aka synchronously).

On the other hand, the createImplementationObject method should not actually 
call deactivate, as all that needs to be undone is

   > object creation: nothing to do, we just ignore the reference to the newly 
created object
   > reference binding: we need to unbind any bound references
   > activate method: nothing to do (if object creation fails before, activate 
is not called, otherwise activate failed)

So, the fix is to just make sure, any bound references are unbound and that - 
in the case of an immediate component - the state is not set to active and - if 
so configured - no services are registered.

Fixed like this in Rev. 568657

> Intermittent exception during Felix shutdown
> --------------------------------------------
>
>                 Key: FELIX-341
>                 URL: https://issues.apache.org/jira/browse/FELIX-341
>             Project: Felix
>          Issue Type: Bug
>          Components: Declarative Services
>    Affects Versions: 1.0.0
>            Reporter: Rajini Sivaram
>            Assignee: Felix Meschberger
>
> 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 framework and the 
> latest snapshot of SCR. 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.");
>         }
>     }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to