Github user aledsage commented on a diff in the pull request:

    https://github.com/apache/incubator-brooklyn/pull/617#discussion_r30589991
  
    --- Diff: 
usage/rest-server/src/main/java/brooklyn/rest/resources/ServerResource.java ---
    @@ -126,45 +126,62 @@ public void shutdown(final boolean stopAppsFirst, 
final boolean forceShutdownOnE
     
             new Thread("shutdown") {
                 public void run() {
    -                if (stopAppsFirst) {
    -                    CountdownTimer shutdownTimeoutTimer = null;
    -                    if (!shutdownTimeout.equals(Duration.ZERO)) {
    -                        shutdownTimeoutTimer = 
shutdownTimeout.countdownTimer();
    -                    }
    +                boolean terminateTried = false;
    +                try {
    +                    if (stopAppsFirst) {
    +                        CountdownTimer shutdownTimeoutTimer = null;
    +                        if (!shutdownTimeout.equals(Duration.ZERO)) {
    +                            shutdownTimeoutTimer = 
shutdownTimeout.countdownTimer();
    +                        }
     
    -                    List<Task<?>> stoppers = new ArrayList<Task<?>>();
    -                    for (Application app: mgmt().getApplications()) {
    -                        if (app instanceof StartableApplication)
    -                            
stoppers.add(Entities.invokeEffector((EntityLocal)app, app, 
StartableApplication.STOP));
    -                    }
    +                        List<Task<?>> stoppers = new ArrayList<Task<?>>();
    +                        for (Application app: mgmt().getApplications()) {
    +                            if (app instanceof StartableApplication)
    +                                
stoppers.add(Entities.invokeEffector((EntityLocal)app, app, 
StartableApplication.STOP));
    +                        }
     
    -                    try {
                             for (Task<?> t: stoppers) {
                                 if (!waitAppShutdown(shutdownTimeoutTimer, t)) 
{
                                     //app stop error
                                     hasAppErrorsOrTimeout.set(true);
                                 }
                             }
    -                    } catch (TimeoutException e) {
    +                    }
    +
    +                    terminateTried = true;
    +                    ((ManagementContextInternal)mgmt()).terminate(); 
    +
    +                } catch (Throwable e) {
    +                    Throwable interesting = 
Exceptions.getFirstInteresting(e);
    +                    if (interesting instanceof TimeoutException) {
                             //timeout while waiting for apps to stop
    +                        log.warn("Timeout shutting down: 
"+Exceptions.collapseText(e));
    +                        log.debug("Timeout shutting down: "+e, e);
                             hasAppErrorsOrTimeout.set(true);
    +                        
    +                    } else {
    +                        // swallow fatal, so we notify the outer loop to 
continue with shutdown
    +                        log.error("Unexpected error shutting down: 
"+Exceptions.collapseText(e), e);
    +                        
                         }
    -
    -                    if (hasAppErrorsOrTimeout.get() && 
!forceShutdownOnError) {
    -                        complete();
    -                        //There are app errors, don't exit the process.
    -                        return;
    +                    hasAppErrorsOrTimeout.set(true);
    +                    
    +                    if (!terminateTried) {
    +                        ((ManagementContextInternal)mgmt()).terminate(); 
                         }
    +                } finally {
    +
    +                    complete();
    +                
    +                    if (!hasAppErrorsOrTimeout.get() || 
forceShutdownOnError) {
    +                        //give the http request a chance to complete 
gracefully
    +                        Time.sleep(delayForHttpReturn);
    +                        System.exit(0);
    +                    }
    +                    
    +                    // There are app errors, don't exit the process, 
allowing any exception to continue throwing
    +                    log.warn("Abandoning shutdown because there were 
errors and shutdown was not forced.");
    --- End diff --
    
    personal preference to put this kind of thing in an else block (even though 
the above block will have done `System.exit`, so can only reach here if we 
didn't go into the if).


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to