summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris St. Pierre <chris.a.st.pierre@gmail.com>2014-02-19 08:08:37 -0500
committerChris St. Pierre <chris.a.st.pierre@gmail.com>2014-02-19 08:24:07 -0500
commit8a8a47998438707f988838b505b98b99a11ce687 (patch)
tree76ec69e4a9d2ab29e10908c7bd3b8fd1b0fedc4d
parent92d94a3f6164f74d7ff48703b002e9127d7d7821 (diff)
downloadbcfg2-8a8a47998438707f988838b505b98b99a11ce687.tar.gz
bcfg2-8a8a47998438707f988838b505b98b99a11ce687.tar.bz2
bcfg2-8a8a47998438707f988838b505b98b99a11ce687.zip
core: only shut down core once
-rw-r--r--src/lib/Bcfg2/Server/Core.py10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/lib/Bcfg2/Server/Core.py b/src/lib/Bcfg2/Server/Core.py
index 38daa870e..03bc7bff4 100644
--- a/src/lib/Bcfg2/Server/Core.py
+++ b/src/lib/Bcfg2/Server/Core.py
@@ -189,6 +189,12 @@ class BaseCore(object):
self.setup = setup
atexit.register(self.shutdown)
+ #: if :func:`Bcfg2.Server.Core.shutdown` is called explicitly,
+ #: then :mod:`atexit` calls it *again*, so it gets called
+ #: twice. This is potentially bad, so we use
+ #: :attr:`Bcfg2.Server.Core._running` as a flag to determine
+ #: if the core needs to be shutdown, and only do it once.
+ self._running = True
#: Threading event to signal worker threads (e.g.,
#: :attr:`fam_thread`) to shutdown
@@ -451,9 +457,13 @@ class BaseCore(object):
def shutdown(self):
""" Perform plugin and FAM shutdown tasks. """
+ if not self._running:
+ self.logger.debug("%s: Core already shut down" % self.name)
+ return
self.logger.info("%s: Shutting down core..." % self.name)
if not self.terminate.isSet():
self.terminate.set()
+ self._running = False
self.fam.shutdown()
self.logger.info("%s: FAM shut down" % self.name)
for plugin in list(self.plugins.values()):