diff --git a/borg/platform.py b/borg/platform.py index 1bc8ee5e4..d6c2e55d8 100644 --- a/borg/platform.py +++ b/borg/platform.py @@ -1,5 +1,16 @@ +import os import sys + +# POSIX-only, from borg 1.1 platform.base +def sync_dir(path): + fd = os.open(path, os.O_RDONLY) + try: + os.fsync(fd) + finally: + os.close(fd) + + if sys.platform.startswith('linux'): # pragma: linux only from .platform_linux import acl_get, acl_set, API_VERSION elif sys.platform.startswith('freebsd'): # pragma: freebsd only diff --git a/borg/repository.py b/borg/repository.py index 67e4b1f27..275802751 100644 --- a/borg/repository.py +++ b/borg/repository.py @@ -16,6 +16,7 @@ from .helpers import Error, ErrorWithTraceback, IntegrityError, Location, Progre from .hashindex import NSIndex from .locking import UpgradableLock, LockError, LockErrorT from .lrucache import LRUCache +from .platform import sync_dir MAX_OBJECT_SIZE = 20 * 1024 * 1024 MAGIC = b'BORG_SEG' @@ -600,6 +601,7 @@ class LoggedIO: dirname = os.path.join(self.path, 'data', str(self.segment // self.segments_per_dir)) if not os.path.exists(dirname): os.mkdir(dirname) + sync_dir(os.path.join(self.path, 'data')) self._write_fd = open(self.segment_filename(self.segment), 'ab') self._write_fd.write(MAGIC) self.offset = MAGIC_LEN @@ -744,4 +746,5 @@ class LoggedIO: # avoids spoiling the cache for the OS and other processes. os.posix_fadvise(self._write_fd.fileno(), 0, 0, os.POSIX_FADV_DONTNEED) self._write_fd.close() + sync_dir(os.path.dirname(self._write_fd.name)) self._write_fd = None