Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Increase resource limits to prevent crashes #887

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions leapp/utils/workarounds/__init__.py
Original file line number Diff line number Diff line change
@@ -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()
38 changes: 38 additions & 0 deletions leapp/utils/workarounds/resources.py
Original file line number Diff line number Diff line change
@@ -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)
Loading