瀏覽代碼

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)
Thomas Waldmann 5 年之前
父節點
當前提交
b43d3bb7fa
共有 3 個文件被更改,包括 22 次插入16 次删除
  1. 12 0
      docs/usage_general.rst.inc
  2. 5 0
      src/borg/helpers/__init__.py
  3. 5 16
      src/borg/platform/linux.pyx

+ 12 - 0
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
 

+ 5 - 0
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

+ 5 - 16
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. :)