From 57475f4b720fc9ce6fc14187a067a748303c056e Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 12 Feb 2022 20:32:50 +0100 Subject: [PATCH 1/2] compact: derive freed space from quota use before/after, fixes #5679 due to the way quota accounting is done, this is likely not 100% precise, but much better than selling the hints as the truth. Backport notes: 1.1 did not report how much space was freed so I have added the message. --- src/borg/repository.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/borg/repository.py b/src/borg/repository.py index e5c09c3c5..45e321c0f 100644 --- a/src/borg/repository.py +++ b/src/borg/repository.py @@ -725,6 +725,7 @@ class Repository: """ if not self.compact: return + quota_use_before = self.storage_quota_use index_transaction_id = self.get_index_transaction_id() segments = self.segments unused = [] # list of segments, that are not used anymore @@ -847,6 +848,8 @@ class Repository: pi.show() pi.finish() complete_xfer(intermediate=False) + quota_use_after = self.storage_quota_use + logger.info('compaction freed about %s repository space.', format_file_size(quota_use_before - quota_use_after)) logger.debug('compaction completed.') def replay_segments(self, index_transaction_id, segments_transaction_id): From a257edbe3a9480d09e1d27423d8f1ceac5897192 Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Sat, 12 Feb 2022 20:36:57 +0100 Subject: [PATCH 2/2] compact: not "freeable", but "maybe freeable" e.g. if there is a ton of DELs in a segment, they all are maybe freeable, but only if we also got rid of the respective PUTs (see also #6289). --- src/borg/repository.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/borg/repository.py b/src/borg/repository.py index 45e321c0f..9797ab91b 100644 --- a/src/borg/repository.py +++ b/src/borg/repository.py @@ -756,13 +756,15 @@ class Repository: pi.show() continue segment_size = self.io.segment_size(segment) + freeable_ratio = 1.0 * freeable_space / segment_size if segment_size > 0.2 * self.max_segment_size and freeable_space < 0.15 * segment_size: - logger.debug('not compacting segment %d (only %d bytes are sparse)', segment, freeable_space) + logger.debug('not compacting segment %d (maybe freeable: %2.2f%% [%d bytes])', + segment, freeable_ratio * 100.0, freeable_space) pi.show() continue segments.setdefault(segment, 0) - logger.debug('compacting segment %d with usage count %d and %d freeable bytes', - segment, segments[segment], freeable_space) + logger.debug('compacting segment %d with usage count %d (maybe freeable: %2.2f%% [%d bytes])', + segment, segments[segment], freeable_ratio * 100.0, freeable_space) for tag, key, offset, data in self.io.iter_objects(segment, include_data=True): if tag == TAG_COMMIT: continue