|
@@ -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
|