less blocking on fact reading ()

* less blocking on fact reading


Co-authored-by: Martin Krizek <martin.krizek@gmail.com>
This commit is contained in:
Brian Coca 2021-03-23 10:27:53 -04:00 committed by GitHub
parent 2bff120db6
commit 232eeee206
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 33 additions and 10 deletions
changelogs/fragments
lib/ansible/module_utils/facts

View file

@ -0,0 +1,2 @@
bugfixes:
- Try to avoid kernel 'blocking' state on reading files while fact gathering.

View file

@ -16,26 +16,47 @@
from __future__ import (absolute_import, division, print_function) from __future__ import (absolute_import, division, print_function)
__metaclass__ = type __metaclass__ = type
import fcntl
import os import os
def get_file_content(path, default=None, strip=True): def get_file_content(path, default=None, strip=True):
'''
Return the contents of a given file path
:args path: path to file to return contents from
:args default: value to return if we could not read file
:args strip: controls if we strip whitespace from the result or not
:returns: String with file contents (optionally stripped) or 'default' value
'''
data = default data = default
if os.path.exists(path) and os.access(path, os.R_OK): if os.path.exists(path) and os.access(path, os.R_OK):
try: try:
datafile = open(path)
try: try:
datafile = open(path) # try to not enter kernel 'block' mode, which prevents timeouts
data = datafile.read() fd = datafile.fileno()
if strip: flag = fcntl.fcntl(fd, fcntl.F_GETFL)
data = data.strip() fcntl.fcntl(fd, fcntl.F_SETFL, flag | os.O_NONBLOCK)
if len(data) == 0: except Exception:
data = default pass # not required to operate, but would have been nice!
finally:
datafile.close() # actually read the data
data = datafile.read()
if strip:
data = data.strip()
if len(data) == 0:
data = default
except Exception: except Exception:
# ignore errors as some jails/containers might have readable permissions but not allow reads to proc # ignore errors as some jails/containers might have readable permissions but not allow reads
# done in 2 blocks for 2.4 compat
pass pass
finally:
datafile.close()
return data return data