From add073d8555520c5fd496d6d64e13b6504bff695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Lebleu?= Date: Sun, 13 Mar 2016 19:04:09 +0100 Subject: [PATCH] [enh] Check for stale lock file --- moulinette/core.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/moulinette/core.py b/moulinette/core.py index 6479f681..e4769d11 100644 --- a/moulinette/core.py +++ b/moulinette/core.py @@ -540,6 +540,7 @@ class MoulinetteLock(object): self.interval = interval self._lockfile = '/var/run/moulinette_%s.lock' % namespace + self._stale_checked = False self._locked = False self._bypass = False @@ -559,13 +560,18 @@ class MoulinetteLock(object): break if not os.path.isfile(self._lockfile): - # Create the lock file - try: - (open(self._lockfile, 'w')).close() - except IOError: - raise MoulinetteError(errno.EPERM, - '%s. %s.' % (m18n.g('permission_denied'), m18n.g('root_required'))) + self._lock() break + elif not self._stale_checked: + self._stale_checked = True + with open(self._lockfile) as f: + lock_pid = f.read().strip() + # Delete stale lock file + if not lock_pid or not os.path.exists( + os.path.join('/proc', lock_pid, 'exe')): + logger.debug('stale lock file found') + self._lock() + break if (time.time() - start_time) > self.timeout: raise MoulinetteError(errno.EBUSY, @@ -589,6 +595,16 @@ class MoulinetteLock(object): logger.debug('lock has been released') self._locked = False + def _lock(self): + try: + with open(self._lockfile, 'w') as f: + f.write(str(os.getpid())) + except IOError: + raise MoulinetteError( + errno.EPERM, '%s. %s.'.format( + m18n.g('permission_denied'), + m18n.g('root_required'))) + def __enter__(self): if not self._locked: self.acquire()