mirror of https://github.com/borgbackup/borg.git
Merge pull request #2104 from ThomasWaldmann/fix-fadvise-fail
Work around fadvise fail
This commit is contained in:
commit
2c1751cbd5
|
@ -821,19 +821,35 @@ class LoggedIO:
|
||||||
self.close_segment() # after-commit fsync()
|
self.close_segment() # after-commit fsync()
|
||||||
|
|
||||||
def close_segment(self):
|
def close_segment(self):
|
||||||
if self._write_fd:
|
# set self._write_fd to None early to guard against reentry from error handling code pathes:
|
||||||
|
fd, self._write_fd = self._write_fd, None
|
||||||
|
if fd is not None:
|
||||||
|
dirname = None
|
||||||
|
try:
|
||||||
self.segment += 1
|
self.segment += 1
|
||||||
self.offset = 0
|
self.offset = 0
|
||||||
self._write_fd.flush()
|
dirname = os.path.dirname(fd.name)
|
||||||
os.fsync(self._write_fd.fileno())
|
fd.flush()
|
||||||
|
fileno = fd.fileno()
|
||||||
|
os.fsync(fileno)
|
||||||
if hasattr(os, 'posix_fadvise'): # only on UNIX
|
if hasattr(os, 'posix_fadvise'): # only on UNIX
|
||||||
|
try:
|
||||||
# tell the OS that it does not need to cache what we just wrote,
|
# tell the OS that it does not need to cache what we just wrote,
|
||||||
# avoids spoiling the cache for the OS and other processes.
|
# avoids spoiling the cache for the OS and other processes.
|
||||||
os.posix_fadvise(self._write_fd.fileno(), 0, 0, os.POSIX_FADV_DONTNEED)
|
os.posix_fadvise(fileno, 0, 0, os.POSIX_FADV_DONTNEED)
|
||||||
dirname = os.path.dirname(self._write_fd.name)
|
except OSError:
|
||||||
self._write_fd.close()
|
# usually, posix_fadvise can't fail for us, but there seem to
|
||||||
|
# be failures when running borg under docker on ARM, likely due
|
||||||
|
# to a bug outside of borg.
|
||||||
|
# also, there is a python wrapper bug, always giving errno = 0.
|
||||||
|
# https://github.com/borgbackup/borg/issues/2095
|
||||||
|
# as this call is not critical for correct function (just to
|
||||||
|
# optimize cache usage), we ignore these errors.
|
||||||
|
pass
|
||||||
|
finally:
|
||||||
|
fd.close()
|
||||||
|
if dirname:
|
||||||
sync_dir(dirname)
|
sync_dir(dirname)
|
||||||
self._write_fd = None
|
|
||||||
|
|
||||||
|
|
||||||
MAX_DATA_SIZE = MAX_OBJECT_SIZE - LoggedIO.put_header_fmt.size
|
MAX_DATA_SIZE = MAX_OBJECT_SIZE - LoggedIO.put_header_fmt.size
|
||||||
|
|
Loading…
Reference in New Issue