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.
This commit is contained in:
Thomas Waldmann 2019-08-23 01:28:30 +02:00
parent 3045aec220
commit beb948fc71
3 changed files with 23 additions and 16 deletions

View File

@ -218,6 +218,18 @@ General:
When set to no (default: yes), system information (like OS, Python version, ...) in When set to no (default: yes), system information (like OS, Python version, ...) in
exceptions is not shown. exceptions is not shown.
Please only use for good reasons as it makes issues harder to analyze. 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 TMPDIR
where temporary files are stored (might need a lot of temporary space for some operations), see tempfile_ for details where temporary files are stored (might need a lot of temporary space for some operations), see tempfile_ for details

View File

@ -81,6 +81,12 @@ from . import shellpattern
from .constants import * # NOQA from .constants import * # NOQA
# 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 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 warning or error occurred during their operation. This is different from archiver.exit_code, which is only accessible

View File

@ -5,6 +5,7 @@ import re
import stat import stat
import subprocess import subprocess
from ..helpers import workarounds
from ..helpers import posix_acl_use_stored_uid_gid from ..helpers import posix_acl_use_stored_uid_gid
from ..helpers import user2uid, group2gid from ..helpers import user2uid, group2gid
from ..helpers import safe_decode, safe_encode from ..helpers import safe_decode, safe_encode
@ -240,23 +241,11 @@ cdef _sync_file_range(fd, offset, length, flags):
cdef unsigned PAGE_MASK = sysconf(_SC_PAGESIZE) - 1 cdef unsigned PAGE_MASK = sysconf(_SC_PAGESIZE) - 1
def _is_WSL(): if 'basesyncfile' in workarounds:
"""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():
class SyncFile(BaseSyncFile): class SyncFile(BaseSyncFile):
# if we are on Microsoft's "Windows Subsytem for Linux", use the # if we are on platforms with a broken or not implemented sync_file_range,
# more generic BaseSyncFile to avoid issues like seen there: # use the more generic BaseSyncFile to avoid issues.
# https://github.com/borgbackup/borg/issues/1961 # see basesyncfile description in our docs for details.
pass pass
else: else:
# a real Linux, so we can do better. :) # a real Linux, so we can do better. :)