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

This commit is contained in:
Martin Krizek 2019-07-11 18:14:42 +02:00 committed by GitHub
parent 4ab364eaaf
commit b0f38931b0
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 27 deletions

View file

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

View file

@ -413,38 +413,42 @@ class YumModule(YumDnf):
def is_lockfile_pid_valid(self):
try:
with open(self.lockfile, 'r') as f:
oldpid = int(f.readline())
except ValueError:
# invalid data
os.unlink(self.lockfile)
return False
except (IOError, OSError) as e:
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':
# Zombie
try:
with open(self.lockfile, 'r') as f:
oldpid = int(f.readline())
except ValueError:
# invalid data
os.unlink(self.lockfile)
return False
except IOError:
if oldpid == os.getpid():
# that's us?
os.unlink(self.lockfile)
return False
try:
os.kill(oldpid, 0)
except OSError as e:
if e.errno == errno.ESRCH:
# No such process
with open("/proc/%d/stat" % oldpid, 'r') as f:
stat = f.readline()
if stat.split()[2] == 'Z':
# Zombie
os.unlink(self.lockfile)
return False
except IOError:
# 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)))
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
return True