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
This commit is contained in:
Thomas Waldmann 2019-02-22 13:19:12 +01:00
parent d644323333
commit 25264dce1f
1 changed files with 9 additions and 5 deletions

View File

@ -690,11 +690,11 @@ class Repository:
"""Compact sparse segments by copying data into new segments """Compact sparse segments by copying data into new segments
""" """
if not self.compact: if not self.compact:
logger.debug('nothing to do: compact empty')
return return
index_transaction_id = self.get_index_transaction_id() index_transaction_id = self.get_index_transaction_id()
segments = self.segments segments = self.segments
unused = [] # list of segments, that are not used anymore unused = [] # list of segments, that are not used anymore
logger = create_logger('borg.debug.compact_segments')
def complete_xfer(intermediate=True): def complete_xfer(intermediate=True):
# complete the current transfer (when some target segment is full) # complete the current transfer (when some target segment is full)
@ -723,13 +723,17 @@ class Repository:
pi.show() pi.show()
continue continue
segment_size = self.io.segment_size(segment) segment_size = self.io.segment_size(segment)
if segment_size > 0.2 * self.max_segment_size and freeable_space < 0.15 * segment_size: freeable_ratio = 1.0 * freeable_space / segment_size
logger.debug('not compacting segment %d (only %d bytes are sparse)', segment, freeable_space) # 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() pi.show()
continue continue
segments.setdefault(segment, 0) segments.setdefault(segment, 0)
logger.debug('compacting segment %d with usage count %d and %d freeable bytes', logger.debug('compacting segment %d with usage count %d (freeable: %2.2f%% [%d bytes])',
segment, segments[segment], freeable_space) segment, segments[segment], freeable_ratio * 100.0, freeable_space)
for tag, key, offset, data in self.io.iter_objects(segment, include_data=True): for tag, key, offset, data in self.io.iter_objects(segment, include_data=True):
if tag == TAG_COMMIT: if tag == TAG_COMMIT:
continue continue