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

Rob Walker commented on FELIX-3160:
-----------------------------------

Certainly always happened our side.

Here's the code in our activator:

    public void start(BundleContext context) 
            throws 
                    Exception
    {
        this.context = context;
        ...
        // Only run sweeper once fully started
        this.context.addFrameworkListener(new FrameworkListener()
                {
                                public void frameworkEvent(FrameworkEvent evt) 
                                {
                                        if (evt.getType() == 
FrameworkEvent.STARTED)
                                        {
                                           runSweeper();
                                        }
                                        else if (evt.getType() == 
FrameworkEvent.ERROR)
                                        {
                                                diag.debug("Framework error, 
bundle: " + evt.getBundle(), evt.getThrowable());
                                        }
                                }
                });
    }


We added the diag.debug when we started getting framework errors - that's what 
nailed the source of the NPE

The runSweeper method is very simple. This is a framework restart - so we are 
warm starting using previously cached and started bundles. The sweeper looks 
for our transient bundles and cleans them out. They used START_TRANSIENT in the 
last run of the framework, this time around they only reach an INSTALLED state 
on startup.

    protected void runSweeper() 
    {
                // TODO Auto-generated method stub
        for (Bundle bundle : this.context.getBundles())
        {
                try
                {
                        if 
(bundle.getSymbolicName().startsWith(VtLibrary.TRANSIENT_PREFIX) &&
                            bundle.getState() == Bundle.INSTALLED)
                        {
                                diag.debug("Removing transient bundle: " + 
bundle.toString());
                                bundle.uninstall();
                        }
                }
                catch (BundleException be)
                {
                app.error("Watchdog: sweeper error removing transient bundle: " 
+ bundle.getSymbolicName());                            
                }
        }
        }

Not really sure what the trigger for m_content being null at uninstall time - 
whether it's to do with the uninstall() being called from inside the event 
handle, or whether some facet of the framework restart has left m_content null.




                
> NPE in BundleRevisionImpl.close() when uninstalling a bundle
> ------------------------------------------------------------
>
>                 Key: FELIX-3160
>                 URL: https://issues.apache.org/jira/browse/FELIX-3160
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>    Affects Versions: framework-4.0.0
>            Reporter: Rob Walker
>            Assignee: Rob Walker
>            Priority: Minor
>             Fix For: framework-4.2.0
>
>
> There seems to be a case where m_content can be null when uninstalling a 
> bundle, causing the following code to throw an NPE:
>     synchronized void close()
>     {
>         try
>         {
>             resolve(null);
>         }
>         catch (Exception ex)
>         {
>             ((BundleImpl) m_bundle).getFramework().getLogger().log(
>                 Logger.LOG_ERROR, "Error releasing revision: " + 
> ex.getMessage(), ex);
>         }
>         
>        m_content.close();
> I've added a simple check for null around the close in my version to avoid 
> the exception, which I'll check in.
> I'm not sure of the scenarios where this can legally be null at this point, 
> and whether there's some nastier underlying circumstance that needs 
> investigating. We see it under the following circumstances:
> * we register a listener that looks for framework STARTED
> * when triggered, this iterates all bundles and performs an uninstall on ones 
> which we determine are zombies leftover from a previous run
> Aside from the fact we're calling uninstall from inside an event handling 
> method, there doesn't anything else unusual about this code.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to