From b43d3bb7fabcccbd4b638237c82159ba9d704475 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Fri, 23 Aug 2019 01:28:30 +0200 Subject: [PATCH] new BORG_WORKAROUNDS mechanism, basesyncfile, fixes #4710 remove WSL autodetection. if WSL still has this problem, you need to set BORG_WORKAROUNDS=basesyncfile in the borg process environment to work around it. (cherry picked from commit beb948fc71c1be266f83d0e5daf090047f8f29ca) --- docs/usage_general.rst.inc | 12 ++++++++++++ src/borg/helpers/__init__.py | 5 +++++ src/borg/platform/linux.pyx | 21 +++++---------------- 3 files changed, 22 insertions(+), 16 deletions(-) diff --git a/docs/usage_general.rst.inc b/docs/usage_general.rst.inc index 0de902bab..4506622fb 100644 --- a/docs/usage_general.rst.inc +++ b/docs/usage_general.rst.inc @@ -218,6 +218,18 @@ General: When set to no (default: yes), system information (like OS, Python version, ...) in exceptions is not shown. Please only use for good reasons as it makes issues harder to analyze. + BORG_WORKAROUNDS + A list of comma separated strings that trigger workarounds in borg, + e.g. to work around bugs in other software. + + Currently known strings are: + + basesyncfile + Use the more simple BaseSyncFile code to avoid issues with sync_file_range. + You might need this to run borg on WSL (Windows Subsystem for Linux) or + in systemd.nspawn containers on some architectures (e.g. ARM). + Using this does not affect data safety, but might result in a more bursty + write to disk behaviour (not continuously streaming to disk). TMPDIR where temporary files are stored (might need a lot of temporary space for some operations), see tempfile_ for details diff --git a/src/borg/helpers/__init__.py b/src/borg/helpers/__init__.py index d2c217875..34a59b903 100644 --- a/src/borg/helpers/__init__.py +++ b/src/borg/helpers/__init__.py @@ -21,6 +21,11 @@ from .yes import * # NOQA from .msgpack import is_slow_msgpack, is_supported_msgpack, int_to_bigint, bigint_to_int, get_limited_unpacker from . import msgpack +# generic mechanism to enable users to invoke workarounds by setting the +# BORG_WORKAROUNDS environment variable to a list of comma-separated strings. +# see the docs for a list of known workaround strings. +workarounds = tuple(os.environ.get('BORG_WORKAROUNDS', '').split(',')) + """ The global exit_code variable is used so that modules other than archiver can increase the program exit code if a warning or error occurred during their operation. This is different from archiver.exit_code, which is only accessible diff --git a/src/borg/platform/linux.pyx b/src/borg/platform/linux.pyx index 2143ea574..2f53e8161 100644 --- a/src/borg/platform/linux.pyx +++ b/src/borg/platform/linux.pyx @@ -5,6 +5,7 @@ import subprocess from .posix import posix_acl_use_stored_uid_gid from .posix import user2uid, group2gid +from ..helpers import workarounds from ..helpers import safe_decode, safe_encode from .base import SyncFile as BaseSyncFile from .base import safe_fadvise @@ -316,23 +317,11 @@ cdef _sync_file_range(fd, offset, length, flags): cdef unsigned PAGE_MASK = sysconf(_SC_PAGESIZE) - 1 -def _is_WSL(): - """detect Windows Subsystem for Linux""" - try: - with open('/proc/version') as fd: - linux_version = fd.read() - # hopefully no non-WSL Linux will ever mention 'Microsoft' in the kernel version: - return 'Microsoft' in linux_version - except: # noqa - # make sure to never ever crash due to this check. - return False - - -if _is_WSL(): +if 'basesyncfile' in workarounds: class SyncFile(BaseSyncFile): - # if we are on Microsoft's "Windows Subsytem for Linux", use the - # more generic BaseSyncFile to avoid issues like seen there: - # https://github.com/borgbackup/borg/issues/1961 + # if we are on platforms with a broken or not implemented sync_file_range, + # use the more generic BaseSyncFile to avoid issues. + # see basesyncfile description in our docs for details. pass else: # a real Linux, so we can do better. :)