chunker: use safe_fadvise

also: refactor safe_advise a bit, use has_posix_fadvise.
This commit is contained in:
Thomas Waldmann 2025-06-04 13:28:32 +02:00
parent 2295c83c7e
commit 66f10712b4
No known key found for this signature in database
GPG key ID: 243ACFA951F78E01
2 changed files with 6 additions and 6 deletions

View file

@ -13,6 +13,7 @@ from libc.stdlib cimport malloc, free
from libc.string cimport memcpy, memmove
from .constants import CH_DATA, CH_ALLOC, CH_HOLE, zeros
from .platform import safe_fadvise
# this will be True if Python's seek implementation supports data/holes seeking.
# this does not imply that it will actually work on the filesystem,
@ -47,11 +48,7 @@ def dread(offset, size, fd=None, fh=-1):
use_fh = fh >= 0
if use_fh:
data = os.read(fh, size)
if hasattr(os, 'posix_fadvise'):
# UNIX only and, in case of block sizes that are not a multiple of the
# system's page size, better be used with a bug fixed linux kernel > 4.6.0,
# see comment/workaround in _chunker.c and borgbackup issue #907.
os.posix_fadvise(fh, offset, len(data), os.POSIX_FADV_DONTNEED)
safe_fadvise(fh, offset, len(data), "DONTNEED")
return data
else:
return fd.read(size)

View file

@ -21,6 +21,7 @@ are correctly composed into the base functionality.
API_VERSION = "1.2_05"
fdatasync = getattr(os, "fdatasync", os.fsync)
has_posix_fadvise = hasattr(os, "posix_fadvise")
from .xattr import ENOATTR
@ -114,9 +115,11 @@ def sync_dir(path):
def safe_fadvise(fd, offset, len, advice):
if hasattr(os, "posix_fadvise"):
if has_posix_fadvise:
advice = getattr(os, "POSIX_FADV_" + advice)
try:
# UNIX only and, in case of block sizes that are not a multiple of the system's page size,
# better be used with a bug fixed linux kernel > 4.6.0, see borgbackup issue #907.
os.posix_fadvise(fd, offset, len, advice)
except OSError:
# usually, posix_fadvise can't fail for us, but there seem to