changeset 51343:5c0693553cb6

delta-find: split is_good_delta_info into more thematic function Same logic as for candidate filtering, we group code into related sub method. This will help clarifying later patches as some logic is pre-splitted
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 04 Jan 2024 17:20:30 +0100
parents 410afe5b13fc
children f3f35b37f4b2
files mercurial/revlogutils/deltas.py
diffstat 1 files changed, 42 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlogutils/deltas.py	Thu Jan 04 15:35:57 2024 +0100
+++ b/mercurial/revlogutils/deltas.py	Thu Jan 04 17:20:30 2024 +0100
@@ -1042,9 +1042,27 @@
             yield (prev,)
 
     def is_good_delta_info(self, deltainfo):
-        """Returns True if the given delta is good. Good means that it is
-        within the disk span, disk size, and chain length bounds that we know
-        to be performant."""
+        """Returns True if the given delta is good.
+
+        Good means that it is within the disk span, disk size, and chain length
+        bounds that we know to be performant.
+        """
+        if not self._is_good_delta_info_universal(deltainfo):
+            return False
+        if not self._is_good_delta_info_chain_quality(deltainfo):
+            return False
+        if not self._is_good_delta_info_snapshot_constraints(deltainfo):
+            return False
+        return True
+
+    def _is_good_delta_info_universal(self, deltainfo):
+        """Returns True if the given delta is good.
+
+        This performs generic checks needed by all format variants.
+
+        This is used by is_good_delta_info.
+        """
+
         if deltainfo is None:
             return False
 
@@ -1064,11 +1082,19 @@
         if self.revinfo.textlen < deltainfo.deltalen:
             return False
 
+        return True
+
+    def _is_good_delta_info_chain_quality(self, deltainfo):
+        """Returns True if the chain associated with the delta is good.
+
+        This performs checks for format that use delta chains.
+
+        This is used by is_good_delta_info.
+        """
         # - 'deltainfo.distance' is the distance from the base revision --
         #   bounding it limits the amount of I/O we need to do.
 
-        textlen = self.revinfo.textlen
-        defaultmax = textlen * 4
+        defaultmax = self.revinfo.textlen * 4
         maxdist = self.revlog.delta_config.max_deltachain_span
         if not maxdist:
             maxdist = deltainfo.distance  # ensure the conditional pass
@@ -1107,7 +1133,16 @@
             and self.revlog.delta_config.max_chain_len < deltainfo.chainlen
         ):
             return False
+        return True
 
+    def _is_good_delta_info_snapshot_constraints(self, deltainfo):
+        """Returns True if the chain associated with snapshots
+
+        This performs checks for format that use sparse-revlog and intermediate
+        snapshots.
+
+        This is used by is_good_delta_info.
+        """
         # bad delta from intermediate snapshot size limit
         #
         #   If an intermediate snapshot size is higher than the limit.  The
@@ -1115,7 +1150,8 @@
         #   created.
         if (
             deltainfo.snapshotdepth is not None
-            and (textlen >> deltainfo.snapshotdepth) < deltainfo.deltalen
+            and (self.revinfo.textlen >> deltainfo.snapshotdepth)
+            < deltainfo.deltalen
         ):
             return False