From 25264dce1f43cc6e2975a235129a30f696455dbd Mon Sep 17 00:00:00 2001 From: Thomas Waldmann Date: Fri, 22 Feb 2019 13:19:12 +0100 Subject: [PATCH] compact: require >10% freeable space in a segment, fixes #2985 before this, it over-eagerly compacted "small" segments ("small" being < 100MB by default) if there were only a few bytes to be freed. also: - improve debug logging - as compaction is a separate borg command now, use the module logger --- src/borg/repository.py | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/borg/repository.py b/src/borg/repository.py index 3971a69c2..a0706a499 100644 --- a/src/borg/repository.py +++ b/src/borg/repository.py @@ -690,11 +690,11 @@ class Repository: """Compact sparse segments by copying data into new segments """ if not self.compact: + logger.debug('nothing to do: compact empty') return index_transaction_id = self.get_index_transaction_id() segments = self.segments unused = [] # list of segments, that are not used anymore - logger = create_logger('borg.debug.compact_segments') def complete_xfer(intermediate=True): # complete the current transfer (when some target segment is full) @@ -723,13 +723,17 @@ class Repository: pi.show() continue segment_size = self.io.segment_size(segment) - 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) + freeable_ratio = 1.0 * freeable_space / segment_size + # we want to compact if: + # - we can free a considerable relative amount of space (freeable_ratio over some threshold) + if not (freeable_ratio > 0.1): + logger.debug('not compacting segment %d (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 (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