Avoid duplicate /bin/lsblk calls in the setup module.

The setup module calls /bin/lsblk once for each device appearing in the /etc/mtab file. However, the same device appears there mutliple times when the system uses bind-mounts. As a result, /bin/lsblk is being called repeatedly to get the uuid of the same device.

On a system with many mounts, this leads to a TimeoutError in the get_mount_facts function of the setup module as described in #14551.

Fixes #14551
This commit is contained in:
Marc Pujol 2016-02-18 09:15:07 +01:00
parent 517acb5773
commit 6779f91b88

View file

@ -1037,6 +1037,7 @@ class LinuxHardware(Hardware):
@timeout(10) @timeout(10)
def get_mount_facts(self): def get_mount_facts(self):
uuids = dict()
self.facts['mounts'] = [] self.facts['mounts'] = []
mtab = get_file_content('/etc/mtab', '') mtab = get_file_content('/etc/mtab', '')
for line in mtab.split('\n'): for line in mtab.split('\n'):
@ -1052,13 +1053,17 @@ class LinuxHardware(Hardware):
except OSError: except OSError:
continue continue
uuid = 'NA' if fields[0] in uuids:
lsblkPath = module.get_bin_path("lsblk") uuid = uuids[fields[0]]
if lsblkPath: else:
rc, out, err = module.run_command("%s -ln --output UUID %s" % (lsblkPath, fields[0]), use_unsafe_shell=True) uuid = 'NA'
lsblkPath = module.get_bin_path("lsblk")
if lsblkPath:
rc, out, err = module.run_command("%s -ln --output UUID %s" % (lsblkPath, fields[0]), use_unsafe_shell=True)
if rc == 0: if rc == 0:
uuid = out.strip() uuid = out.strip()
uuids[fields[0]] = uuid
self.facts['mounts'].append( self.facts['mounts'].append(
{'mount': fields[1], {'mount': fields[1],