[enh] Check for stale lock file

This commit is contained in:
Jérôme Lebleu 2016-03-13 19:04:09 +01:00
parent c264e1517a
commit add073d855

View file

@ -540,6 +540,7 @@ class MoulinetteLock(object):
self.interval = interval self.interval = interval
self._lockfile = '/var/run/moulinette_%s.lock' % namespace self._lockfile = '/var/run/moulinette_%s.lock' % namespace
self._stale_checked = False
self._locked = False self._locked = False
self._bypass = False self._bypass = False
@ -559,12 +560,17 @@ class MoulinetteLock(object):
break break
if not os.path.isfile(self._lockfile): if not os.path.isfile(self._lockfile):
# Create the lock file self._lock()
try: break
(open(self._lockfile, 'w')).close() elif not self._stale_checked:
except IOError: self._stale_checked = True
raise MoulinetteError(errno.EPERM, with open(self._lockfile) as f:
'%s. %s.' % (m18n.g('permission_denied'), m18n.g('root_required'))) 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 break
if (time.time() - start_time) > self.timeout: if (time.time() - start_time) > self.timeout:
@ -589,6 +595,16 @@ class MoulinetteLock(object):
logger.debug('lock has been released') logger.debug('lock has been released')
self._locked = False 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): def __enter__(self):
if not self._locked: if not self._locked:
self.acquire() self.acquire()