diff options
author | Matt Kemp <matt@mattikus.com> | 2014-10-01 17:16:56 +0000 |
---|---|---|
committer | Matt Kemp <matt@mattikus.com> | 2014-10-01 17:16:56 +0000 |
commit | 43ab15a3d25667a7908ee2ef892dbf4ddff9b445 (patch) | |
tree | ce06f0f3be57261b0f728c544d0c98e581b423f2 /src/lib/Bcfg2/Reporting | |
parent | c3edef5bd2b55266fee96327f17a093a0fb9cce4 (diff) | |
download | bcfg2-43ab15a3d25667a7908ee2ef892dbf4ddff9b445.tar.gz bcfg2-43ab15a3d25667a7908ee2ef892dbf4ddff9b445.tar.bz2 bcfg2-43ab15a3d25667a7908ee2ef892dbf4ddff9b445.zip |
Attempt to break the pid lock during startup.
This commit attempts to break the pidfilelock during startup in cases where the
process may have exited without successfully cleaning up the lockfile. It also
attempts to grab the lock before opening the context. Also applied to the
Collector module, which may have been looking for the wrong exception since it
does not rely on a timeout.
Diffstat (limited to 'src/lib/Bcfg2/Reporting')
-rw-r--r-- | src/lib/Bcfg2/Reporting/Collector.py | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/src/lib/Bcfg2/Reporting/Collector.py b/src/lib/Bcfg2/Reporting/Collector.py index 8ca145f16..50bb49f78 100644 --- a/src/lib/Bcfg2/Reporting/Collector.py +++ b/src/lib/Bcfg2/Reporting/Collector.py @@ -7,7 +7,7 @@ import traceback import threading # pylint: disable=E0611 -from lockfile import LockFailed, LockTimeout +from lockfile import LockFailed, LockTimeout, AlreadyLocked try: from lockfile.pidlockfile import PIDLockFile from lockfile import Error as PIDFileError @@ -118,25 +118,43 @@ class ReportingCollector(object): if self.setup['daemon']: self.logger.debug("Daemonizing") + self.context.pidfile = PIDLockFile(self.setup['daemon']) try: - self.context.pidfile = PIDLockFile(self.setup['daemon']) - self.context.open() + self.context.pidfile.acquire() except LockFailed: self.logger.error("Failed to daemonize: %s" % sys.exc_info()[1]) self.shutdown() return + except AlreadyLocked: + try: # attempt to break the lock + os.kill(self.context.pidfile.read_pid(), 0) + except OSError: # No process with locked PID + self.context.pidfile.break_lock() + else: + self.logger.error("Failed to daemonize: " + "Failed to acquire lock on %s" % + self.setup['daemon']) + self.shutdown() + return except LockTimeout: - self.logger.error("Failed to daemonize: " - "Failed to acquire lock on %s" % - self.setup['daemon']) - self.shutdown() - return + try: # attempt to break the lock + os.kill(self.context.pidfile.read_pid(), 0) + except OSError: # No process with locked PID + self.context.pidfile.break_lock() + else: + self.logger.error("Failed to daemonize: " + "Failed to acquire lock on %s" % + self.setup['daemon']) + self.shutdown() + return except PIDFileError: self.logger.error("Error writing pid file: %s" % traceback.format_exc().splitlines()[-1]) self.shutdown() return + + self.context.open() self.logger.info("Starting daemon") self.transport.start_monitor(self) |