瀏覽代碼

Merge pull request #4387 from ThomasWaldmann/compaction-criteria

improve compaction criteria
TW 6 年之前
父節點
當前提交
1620ae2141
共有 1 個文件被更改,包括 9 次插入5 次删除
  1. 9 5
      src/borg/repository.py

+ 9 - 5
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