diff --git a/leapp/utils/workarounds/__init__.py b/leapp/utils/workarounds/__init__.py index 192cd75ac..d0a186668 100644 --- a/leapp/utils/workarounds/__init__.py +++ b/leapp/utils/workarounds/__init__.py @@ -1,7 +1,9 @@ import leapp.utils.workarounds.mp import leapp.utils.workarounds.fqdn +import leapp.utils.workarounds.resources def apply_workarounds(): leapp.utils.workarounds.mp.apply_workaround() leapp.utils.workarounds.fqdn.apply_workaround() + leapp.utils.workarounds.resources.apply_workaround() diff --git a/leapp/utils/workarounds/resources.py b/leapp/utils/workarounds/resources.py new file mode 100644 index 000000000..b87aab8c0 --- /dev/null +++ b/leapp/utils/workarounds/resources.py @@ -0,0 +1,38 @@ +import resource +from leapp.exceptions import CommandError + +def apply_workaround(): + """ + Set resource limits for the maximum number of open file descriptors and the maximum writable file size. + + :raises: `CommandError` if the resource limits cannot be set + """ + + def set_resource_limit(resource_type, soft, hard): + rtype_string = ( + 'open file descriptors' if resource_type == resource.RLIMIT_NOFILE + else 'writable file size' if resource_type == resource.RLIMIT_FSIZE + else 'unknown resource' + ) + try: + resource.setrlimit(resource_type, (soft, hard)) + except ValueError as err: + raise CommandError( + 'Failure occurred while attempting to set soft limit higher than the hard limit. ' + 'Resource type: {}, error: {}'.format(rtype_string, err) + ) + except OSError as err: + raise CommandError( + 'Failed to set resource limit. Resource type: {}, error: {}'.format(rtype_string, err) + ) + + soft_nofile, _ = resource.getrlimit(resource.RLIMIT_NOFILE) + soft_fsize, _ = resource.getrlimit(resource.RLIMIT_FSIZE) + nofile_limit = 1024*16 + fsize_limit = resource.RLIM_INFINITY + + if soft_nofile < nofile_limit: + set_resource_limit(resource.RLIMIT_NOFILE, nofile_limit, nofile_limit) + + if soft_fsize != fsize_limit: + set_resource_limit(resource.RLIMIT_FSIZE, fsize_limit, fsize_limit)