yum: check whether the lock file disappeared (#58581)

pull/58987/head
Martin Krizek 7 years ago committed by GitHub
parent 4ab364eaaf
commit b0f38931b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -126,8 +126,9 @@ class YumDnf(with_metaclass(ABCMeta, object)):
# default isn't a bad idea # default isn't a bad idea
self.lockfile = '/var/run/yum.pid' self.lockfile = '/var/run/yum.pid'
@abstractmethod
def is_lockfile_pid_valid(self): def is_lockfile_pid_valid(self):
raise NotImplementedError return
def _is_lockfile_present(self): def _is_lockfile_present(self):
return (os.path.isfile(self.lockfile) or glob.glob(self.lockfile)) and self.is_lockfile_pid_valid() return (os.path.isfile(self.lockfile) or glob.glob(self.lockfile)) and self.is_lockfile_pid_valid()

@ -413,38 +413,42 @@ class YumModule(YumDnf):
def is_lockfile_pid_valid(self): def is_lockfile_pid_valid(self):
try: try:
with open(self.lockfile, 'r') as f: try:
oldpid = int(f.readline()) with open(self.lockfile, 'r') as f:
except ValueError: oldpid = int(f.readline())
# invalid data except ValueError:
os.unlink(self.lockfile) # invalid data
return False os.unlink(self.lockfile)
except (IOError, OSError) as e: return False
self.module.fail_json(msg="Failure opening %s: %s" % (self.lockfile, to_native(e)))
if oldpid == os.getpid():
# that's us?
os.unlink(self.lockfile)
return False
try:
with open("/proc/%d/stat" % oldpid, 'r') as f:
stat = f.readline()
if stat.split()[2] == 'Z': if oldpid == os.getpid():
# Zombie # that's us?
os.unlink(self.lockfile) os.unlink(self.lockfile)
return False return False
except IOError:
try: try:
os.kill(oldpid, 0) with open("/proc/%d/stat" % oldpid, 'r') as f:
except OSError as e: stat = f.readline()
if e.errno == errno.ESRCH:
# No such process if stat.split()[2] == 'Z':
# Zombie
os.unlink(self.lockfile) os.unlink(self.lockfile)
return False return False
except IOError:
self.module.fail_json(msg="Unable to check PID %s in %s: %s" % (oldpid, self.lockfile, to_native(e))) # either /proc is not mounted or the process is already dead
try:
# check the state of the process
os.kill(oldpid, 0)
except OSError as e:
if e.errno == errno.ESRCH:
# No such process
os.unlink(self.lockfile)
return False
self.module.fail_json(msg="Unable to check PID %s in %s: %s" % (oldpid, self.lockfile, to_native(e)))
except (IOError, OSError) as e:
# lockfile disappeared?
return False
# another copy seems to be running # another copy seems to be running
return True return True

Loading…
Cancel
Save