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 3f073f9be174..03a9301f6c7d 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 75aca3e5ba78..fd9c886604c5 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 void stopBeans() { 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 5f3abf971872..26525dea5820 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.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 void init() throws IOException { } 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 7cb15e495c89..5f67de84aec7 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 @@ 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 be92074d512a..bba0dccc53c3 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 ApplicationContext getApplicationContext(String name) { 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 6d0e17c0f202..bf6fb24d6a4c 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 @@ protected ApplicationContext loadParentContext(ServletContext servletContext) { 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 cc87aa5cee18..adaaf0843303 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 boolean start() { @Override public boolean stop() { - _dbSyncTimer.cancel(); + if (_dbSyncTimer != null) { + _dbSyncTimer.cancel(); + } return true; }