From 4849368c94f4c5d7e48beb92dba653bc97aa5ba5 Mon Sep 17 00:00:00 2001 From: Bharat Kumar Date: Tue, 21 Apr 2015 16:45:12 +0530 Subject: [PATCH] CLOUDSTACK-8852 Database shows that management server is UP when it is actually stopped from the CCP GUI This was happening as the stop method in clusterMnanagerImpl was not getting callled. Added shutdown hooks to all sub contexts, this enables spring to call the stop mehtods of the beans when management server is shutting down. Conflicts: framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java --- .../centos/SYSCONFDIR/rc.d/init.d/cloud-management.in | 2 +- .../spring/lifecycle/CloudStackExtendedLifeCycle.java | 1 + .../module/factory/CloudStackSpringContext.java | 11 ++++++++--- .../spring/module/model/ModuleDefinitionSet.java | 4 ++++ .../module/model/impl/DefaultModuleDefinitionSet.java | 5 +++++ .../module/web/CloudStackContextLoaderListener.java | 1 + .../contrail/management/ContrailManagerImpl.java | 4 +++- 7 files changed, 23 insertions(+), 5 deletions(-) diff --git a/client/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-management.in b/client/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-management.in index 3f073f9be17..03a9301f6c7 100755 --- a/client/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-management.in +++ b/client/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-management.in @@ -44,7 +44,7 @@ fi NAME="$(basename $0)" stop() { - SHUTDOWN_WAIT="30" + SHUTDOWN_WAIT="40" count="0" if [ -f /var/run/cloud-management.pid ]; then pid=`cat /var/run/cloud-management.pid` diff --git a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java index 75aca3e5ba7..fd9c886604c 100644 --- a/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java +++ b/framework/spring/lifecycle/src/main/java/org/apache/cloudstack/spring/lifecycle/CloudStackExtendedLifeCycle.java @@ -99,6 +99,7 @@ public class CloudStackExtendedLifeCycle extends AbstractBeanCollector { with(new WithComponentLifeCycle() { @Override public void with(ComponentLifecycle lifecycle) { + log.info("stopping bean " + lifecycle.getName()); lifecycle.stop(); } }); diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java index 5f3abf97187..26525dea582 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/factory/CloudStackSpringContext.java @@ -22,6 +22,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,10 +72,14 @@ public class CloudStackSpringContext { } public void registerShutdownHook() { - ApplicationContext base = moduleDefinitionSet.getApplicationContext(baseName); + Map contextMap= moduleDefinitionSet.getContextMap(); - if (base instanceof ConfigurableApplicationContext) { - ((ConfigurableApplicationContext)base).registerShutdownHook(); + for (String appName : contextMap.keySet()) { + ApplicationContext contex = contextMap.get(appName); + if (contex instanceof ConfigurableApplicationContext) { + log.trace("registering shutdown hook for bean "+ appName); + ((ConfigurableApplicationContext)contex).registerShutdownHook(); + } } } diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/ModuleDefinitionSet.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/ModuleDefinitionSet.java index 7cb15e495c8..5f67de84aec 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/ModuleDefinitionSet.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/ModuleDefinitionSet.java @@ -21,12 +21,16 @@ package org.apache.cloudstack.spring.module.model; import org.springframework.context.ApplicationContext; import org.springframework.core.io.Resource; +import java.util.Map; + public interface ModuleDefinitionSet { ModuleDefinition getModuleDefinition(String name); ApplicationContext getApplicationContext(String name); + Map getContextMap(); + Resource[] getConfigResources(String name); } diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java index be92074d512..bba0dccc53c 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/model/impl/DefaultModuleDefinitionSet.java @@ -278,6 +278,11 @@ public class DefaultModuleDefinitionSet implements ModuleDefinitionSet { return contexts.get(name); } + @Override + public Map getContextMap() { + return contexts; + } + @Override public Resource[] getConfigResources(String name) { Set resources = new LinkedHashSet(); diff --git a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java index 6d0e17c0f20..bf6fb24d6a4 100644 --- a/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java +++ b/framework/spring/module/src/main/java/org/apache/cloudstack/spring/module/web/CloudStackContextLoaderListener.java @@ -50,6 +50,7 @@ public class CloudStackContextLoaderListener extends ContextLoaderListener { public void contextInitialized(ServletContextEvent event) { try { cloudStackContext = new CloudStackSpringContext(); + cloudStackContext.registerShutdownHook(); event.getServletContext().setAttribute(CloudStackSpringContext.CLOUDSTACK_CONTEXT_SERVLET_KEY, cloudStackContext); } catch (IOException e) { log.error("Failed to start CloudStack", e); diff --git a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java index cc87aa5cee1..adaaf084330 100644 --- a/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java +++ b/plugins/network-elements/juniper-contrail/src/org/apache/cloudstack/network/contrail/management/ContrailManagerImpl.java @@ -183,7 +183,9 @@ public class ContrailManagerImpl extends ManagerBase implements ContrailManager @Override public boolean stop() { - _dbSyncTimer.cancel(); + if (_dbSyncTimer != null) { + _dbSyncTimer.cancel(); + } return true; }