From 502ebe63be9fd3d56e22c9fcf66beeb23350475f Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Fri, 19 Apr 2019 18:36:38 +0200 Subject: [PATCH] delete archive: consider part files correctly for stats, see #4507 --- src/borg/archive.py | 7 ++++--- src/borg/archiver.py | 5 +++-- src/borg/cache.py | 12 ++++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/borg/archive.py b/src/borg/archive.py index ac8bf8aff..5b5ce0c4b 100644 --- a/src/borg/archive.py +++ b/src/borg/archive.py @@ -845,9 +845,9 @@ def fetch_async_response(wait=True): error = True return exception_ignored # must not return None here - def chunk_decref(id, stats): + def chunk_decref(id, stats, part=False): try: - self.cache.chunk_decref(id, stats, wait=False) + self.cache.chunk_decref(id, stats, wait=False, part=part) except KeyError: cid = bin_to_hex(id) raise ChunksIndexError(cid) @@ -869,8 +869,9 @@ def chunk_decref(id, stats): for item in unpacker: item = Item(internal_dict=item) if 'chunks' in item: + part = not self.consider_part_files and 'part' in item for chunk_id, size, csize in item.chunks: - chunk_decref(chunk_id, stats) + chunk_decref(chunk_id, stats, part=part) except (TypeError, ValueError): # if items metadata spans multiple chunks and one chunk got dropped somehow, # it could be that unpacker yields bad types diff --git a/src/borg/archiver.py b/src/borg/archiver.py index bd178211a..9dd1b6a8c 100644 --- a/src/borg/archiver.py +++ b/src/borg/archiver.py @@ -1132,8 +1132,9 @@ def _delete_archives(self, args, repository): msg = 'Would delete archive: {} ({}/{})' if dry_run else 'Deleting archive: {} ({}/{})' logger.info(msg.format(format_archive(manifest.archives[archive_name]), i, len(archive_names))) if not dry_run: - Archive(repository, key, manifest, archive_name, cache=cache).delete( - stats, progress=args.progress, forced=args.forced) + archive = Archive(repository, key, manifest, archive_name, cache=cache, + consider_part_files=args.consider_part_files) + archive.delete(stats, progress=args.progress, forced=args.forced) if not dry_run: manifest.write() repository.commit(compact=False, save_space=args.save_space) diff --git a/src/borg/cache.py b/src/borg/cache.py index dd3f1f196..76d0c71e3 100644 --- a/src/borg/cache.py +++ b/src/borg/cache.py @@ -909,16 +909,16 @@ def chunk_incref(self, id, stats, size=None, part=False): stats.update(_size, csize, False, part=part) return ChunkListEntry(id, _size, csize) - def chunk_decref(self, id, stats, wait=True): + def chunk_decref(self, id, stats, wait=True, part=False): if not self.txn_active: self.begin_txn() count, size, csize = self.chunks.decref(id) if count == 0: del self.chunks[id] self.repository.delete(id, wait=wait) - stats.update(-size, -csize, True) + stats.update(-size, -csize, True, part=part) else: - stats.update(-size, -csize, False) + stats.update(-size, -csize, False, part=part) def file_known_and_unchanged(self, path_hash, st): """ @@ -1057,16 +1057,16 @@ def chunk_incref(self, id, stats, size=None, part=False): stats.update(size, csize, False, part=part) return ChunkListEntry(id, size, csize) - def chunk_decref(self, id, stats, wait=True): + def chunk_decref(self, id, stats, wait=True, part=False): if not self._txn_active: self.begin_txn() count, size, csize = self.chunks.decref(id) if count == 0: del self.chunks[id] self.repository.delete(id, wait=wait) - stats.update(-size, -csize, True) + stats.update(-size, -csize, True, part=part) else: - stats.update(-size, -csize, False) + stats.update(-size, -csize, False, part=part) def commit(self): if not self._txn_active: