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
Do not use fallocate in swap file creation on xfs. #70
Changes from all commits
2f7d219
bf03074
ab128f1
2b4c443
adad3bd
263a651
5391a1a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -223,42 +223,75 @@ def suggested_swapsize(memsize=None, maxsize=None, fsys=None): | |
return size | ||
|
||
|
||
def create_swapfile(fname, size): | ||
"""Size is in MiB.""" | ||
|
||
errmsg = "Failed to create swapfile '%s' of size %dMB via %s: %s" | ||
|
||
def create_swap(fname, size, method): | ||
otubo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
LOG.debug("Creating swapfile in '%s' on fstype '%s' using '%s'", | ||
fname, fstype, method) | ||
|
||
if method == "fallocate": | ||
cmd = ['fallocate', '-l', '%dM' % size, fname] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Size is a string, not a number, so '%s' format specifier should be used. |
||
elif method == "dd": | ||
cmd = ['dd', 'if=/dev/zero', 'of=%s' % fname, 'bs=1M', | ||
'count=%d' % size] | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. While I don't use xfs, I suspect this too should be using a '%s' format specifier since size is a string. |
||
|
||
try: | ||
util.subp(cmd, capture=True) | ||
except util.ProcessExecutionError as e: | ||
LOG.warning(errmsg, fname, size, method, e) | ||
util.del_file(fname) | ||
|
||
swap_dir = os.path.dirname(fname) | ||
util.ensure_dir(swap_dir) | ||
|
||
fstype = util.get_mount_info(swap_dir)[1] | ||
|
||
if fstype in ("xfs", "btrfs"): | ||
create_swap(fname, size, "dd") | ||
else: | ||
otubo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
try: | ||
create_swap(fname, size, "fallocate") | ||
except util.ProcessExecutionError as e: | ||
LOG.warning(errmsg, fname, size, "dd", e) | ||
LOG.warning("Will attempt with dd.") | ||
create_swap(fname, size, "dd") | ||
|
||
util.chmod(fname, 0o600) | ||
try: | ||
util.subp(['mkswap', fname]) | ||
except util.ProcessExecutionError: | ||
util.del_file(fname) | ||
raise | ||
|
||
|
||
def setup_swapfile(fname, size=None, maxsize=None): | ||
""" | ||
fname: full path string of filename to setup | ||
size: the size to create. set to "auto" for recommended | ||
maxsize: the maximum size | ||
""" | ||
tdir = os.path.dirname(fname) | ||
swap_dir = os.path.dirname(fname) | ||
mibsize = str(int(size / (2 ** 20))) | ||
if str(size).lower() == "auto": | ||
try: | ||
memsize = util.read_meminfo()['total'] | ||
except IOError: | ||
LOG.debug("Not creating swap: failed to read meminfo") | ||
return | ||
|
||
util.ensure_dir(tdir) | ||
size = suggested_swapsize(fsys=tdir, maxsize=maxsize, | ||
util.ensure_dir(swap_dir) | ||
size = suggested_swapsize(fsys=swap_dir, maxsize=maxsize, | ||
memsize=memsize) | ||
|
||
if not size: | ||
LOG.debug("Not creating swap: suggested size was 0") | ||
return | ||
|
||
mbsize = str(int(size / (2 ** 20))) | ||
msg = "creating swap file '%s' of %sMB" % (fname, mbsize) | ||
try: | ||
util.ensure_dir(tdir) | ||
util.log_time(LOG.debug, msg, func=util.subp, | ||
args=[['sh', '-c', | ||
('rm -f "$1" && umask 0066 && ' | ||
otubo marked this conversation as resolved.
Show resolved
Hide resolved
|
||
'{ fallocate -l "${2}M" "$1" || ' | ||
'dd if=/dev/zero "of=$1" bs=1M "count=$2"; } && ' | ||
'mkswap "$1" || { r=$?; rm -f "$1"; exit $r; }'), | ||
'setup_swap', fname, mbsize]]) | ||
|
||
except Exception as e: | ||
raise IOError("Failed %s: %s" % (msg, e)) | ||
util.log_time(LOG.debug, msg="Setting up swap file", func=create_swapfile, | ||
args=[fname, mibsize]) | ||
|
||
return fname | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This too should likely be a '%s' format modifier instead of '%d' since size is a string.