diff --git a/src/borg/archive.py b/src/borg/archive.py index 813c3cacd..3de559e10 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -1131,13 +1131,13 @@ class FilesystemObjectProcessors: self.add_item(item, stats=self.stats) return 'i' # stdin - def process_file(self, path, st, cache, ignore_inode=False): + def process_file(self, path, st, cache): with self.create_helper(path, st, None) as (item, status, hardlinked, hardlink_master): # no status yet is_special_file = is_special(st.st_mode) if not hardlinked or hardlink_master: if not is_special_file: path_hash = self.key.id_hash(safe_encode(os.path.join(self.cwd, path))) - known, ids = cache.file_known_and_unchanged(path_hash, st, ignore_inode) + known, ids = cache.file_known_and_unchanged(path_hash, st) else: # in --read-special mode, we may be called for special files. # there should be no information in the cache about special files processed in diff --git a/src/borg/archiver.py b/src/borg/archiver.py index 8eb8842c0..90fcff691 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -144,6 +144,7 @@ def with_repository(fake=False, invert_fake=False, create=False, lock=True, if cache: with Cache(repository, kwargs['key'], kwargs['manifest'], do_files=getattr(args, 'cache_files', False), + ignore_inode=getattr(args, 'ignore_inode', False), progress=getattr(args, 'progress', False), lock_wait=self.lock_wait, cache_mode=getattr(args, 'files_cache_mode', DEFAULT_FILES_CACHE_MODE)) as cache_: return method(self, args, repository=repository, cache=cache_, **kwargs) @@ -502,7 +503,6 @@ class Archiver: self.output_filter = args.output_filter self.output_list = args.output_list - self.ignore_inode = args.ignore_inode self.nobsdflags = args.nobsdflags self.exclude_nodump = args.exclude_nodump dry_run = args.dry_run @@ -511,7 +511,7 @@ class Archiver: if not dry_run: with Cache(repository, key, manifest, do_files=args.cache_files, progress=args.progress, lock_wait=self.lock_wait, permit_adhoc_cache=args.no_cache_sync, - cache_mode=args.files_cache_mode) as cache: + cache_mode=args.files_cache_mode, ignore_inode=args.ignore_inode) as cache: archive = Archive(repository, key, manifest, args.location.archive, cache=cache, create=True, checkpoint_interval=args.checkpoint_interval, numeric_owner=args.numeric_owner, noatime=args.noatime, noctime=args.noctime, @@ -577,7 +577,7 @@ class Archiver: return if stat.S_ISREG(st.st_mode): if not dry_run: - status = fso.process_file(path, st, cache, self.ignore_inode) + status = fso.process_file(path, st, cache) elif stat.S_ISDIR(st.st_mode): if recurse: tag_paths = dir_is_tagged(path, exclude_caches, exclude_if_present) diff --git a/src/borg/cache.py b/src/borg/cache.py index cb41b5993..5dcd2a23a 100644 --- a/src/borg/cache.py +++ b/src/borg/cache.py @@ -359,10 +359,13 @@ class Cache: shutil.rmtree(path) def __new__(cls, repository, key, manifest, path=None, sync=True, do_files=False, warn_if_unencrypted=True, - progress=False, lock_wait=None, permit_adhoc_cache=False, cache_mode=DEFAULT_FILES_CACHE_MODE): + progress=False, lock_wait=None, permit_adhoc_cache=False, cache_mode=DEFAULT_FILES_CACHE_MODE, + ignore_inode=False): if not do_files and 'd' not in cache_mode: cache_mode = 'd' + elif ignore_inode and 'i' in cache_mode: + cache_mode = ''.join(set(cache_mode) - set('i')) def local(): return LocalCache(repository=repository, key=key, manifest=manifest, path=path, sync=sync, @@ -924,14 +927,13 @@ class LocalCache(CacheStatsMixin): else: stats.update(-size, -csize, False) - def file_known_and_unchanged(self, path_hash, st, ignore_inode=False): + def file_known_and_unchanged(self, path_hash, st): """ Check if we know the file that has this path_hash (know == it is in our files cache) and whether it is unchanged (the size/inode number/cmtime is same for stuff we check in this cache_mode). :param path_hash: hash(file_path), to save some memory in the files cache :param st: the file's stat() result - :param ignore_inode: whether the inode number shall be ignored :return: known, ids (known is True if we have infos about this file in the cache, ids is the list of chunk ids IF the file has not changed, otherwise None). """ @@ -950,7 +952,7 @@ class LocalCache(CacheStatsMixin): entry = FileCacheEntry(*msgpack.unpackb(entry)) if 's' in cache_mode and entry.size != st.st_size: return True, None - if 'i' in cache_mode and not ignore_inode and entry.inode != st.st_ino: + if 'i' in cache_mode and entry.inode != st.st_ino: return True, None if 'c' in cache_mode and bigint_to_int(entry.cmtime) != st.st_ctime_ns: return True, None @@ -1019,7 +1021,7 @@ Chunk index: {0.total_unique_chunks:20d} unknown""" files = None cache_mode = 'd' - def file_known_and_unchanged(self, path_hash, st, ignore_inode=False): + def file_known_and_unchanged(self, path_hash, st): return False, None def memorize_file(self, path_hash, st, ids):