Merge pull request #4736 from saurvs/forward-port-4729

new BORG_WORKAROUNDS mechanism, basesyncfile, fixes #4710
This commit is contained in:
TW 2019-08-27 21:55:58 +02:00 committed by GitHub
commit 975f5627b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 22 additions and 16 deletions

View File

@ -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

View File

@ -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

View File

@ -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. :)