# HG changeset patch # User Pierre-Yves David # Date 1667877179 18000 # Node ID 05db41701ece3773c8650088101be43e66f37ca2 # Parent 4302db0f54c80bce66d7722bfd6e20980ab64597 find-delta: pass the cache-delta usage policy alongside the cache-delta The idea is to give higher level code more control to what will happens with the cache delta passed. This should help with controling how we treat delta's from different sources. The final goal of this change is to allow for server modes where the client can blindly accept any server delta without regards to any local constraints. This will be implemented in later changesets. diff -r 4302db0f54c8 -r 05db41701ece mercurial/revlog.py --- a/mercurial/revlog.py Mon Nov 28 18:58:35 2022 +0100 +++ b/mercurial/revlog.py Mon Nov 07 22:12:59 2022 -0500 @@ -38,6 +38,8 @@ COMP_MODE_DEFAULT, COMP_MODE_INLINE, COMP_MODE_PLAIN, + DELTA_BASE_REUSE_NO, + DELTA_BASE_REUSE_TRY, ENTRY_RANK, FEATURES_BY_VERSION, FLAG_GENERALDELTA, @@ -2458,6 +2460,16 @@ self, write_debug=write_debug ) + if cachedelta is not None and len(cachedelta) == 2: + # If the cached delta has no information about how it should be + # reused, add the default reuse instruction according to the + # revlog's configuration. + if self._generaldelta and self._lazydeltabase: + delta_base_reuse = DELTA_BASE_REUSE_TRY + else: + delta_base_reuse = DELTA_BASE_REUSE_NO + cachedelta = (cachedelta[0], cachedelta[1], delta_base_reuse) + revinfo = revlogutils.revisioninfo( node, p1, diff -r 4302db0f54c8 -r 05db41701ece mercurial/revlogutils/__init__.py --- a/mercurial/revlogutils/__init__.py Mon Nov 28 18:58:35 2022 +0100 +++ b/mercurial/revlogutils/__init__.py Mon Nov 07 22:12:59 2022 -0500 @@ -67,7 +67,7 @@ node: expected hash of the revision p1, p2: parent revs of the revision btext: built text cache consisting of a one-element list - cachedelta: (baserev, uncompressed_delta) or None + cachedelta: (baserev, uncompressed_delta, usage_mode) or None flags: flags associated to the revision storage One of btext[0] or cachedelta must be set. diff -r 4302db0f54c8 -r 05db41701ece mercurial/revlogutils/constants.py --- a/mercurial/revlogutils/constants.py Mon Nov 28 18:58:35 2022 +0100 +++ b/mercurial/revlogutils/constants.py Mon Nov 07 22:12:59 2022 -0500 @@ -301,3 +301,17 @@ SPARSE_REVLOG_MAX_CHAIN_LENGTH = 1000 + +### What should be done with a cached delta and its base ? + +# Ignore the cache when considering candidates. +# +# The cached delta might be used, but the delta base will not be scheduled for +# usage earlier than in "normal" order. +DELTA_BASE_REUSE_NO = 0 + +# Prioritize trying the cached delta base +# +# The delta base will be tested for validy first. So that the cached deltas get +# used when possible. +DELTA_BASE_REUSE_TRY = 1 diff -r 4302db0f54c8 -r 05db41701ece mercurial/revlogutils/debug.py --- a/mercurial/revlogutils/debug.py Mon Nov 28 18:58:35 2022 +0100 +++ b/mercurial/revlogutils/debug.py Mon Nov 07 22:12:59 2022 -0500 @@ -646,7 +646,7 @@ base_text = revlog.revision(base_rev) delta = mdiff.textdiff(base_text, full_text) - cachedelta = (base_rev, delta) + cachedelta = (base_rev, delta, constants.DELTA_BASE_REUSE_TRY) btext = [None] revinfo = revlogutils.revisioninfo( diff -r 4302db0f54c8 -r 05db41701ece mercurial/revlogutils/deltas.py --- a/mercurial/revlogutils/deltas.py Mon Nov 28 18:58:35 2022 +0100 +++ b/mercurial/revlogutils/deltas.py Mon Nov 07 22:12:59 2022 -0500 @@ -20,6 +20,7 @@ COMP_MODE_DEFAULT, COMP_MODE_INLINE, COMP_MODE_PLAIN, + DELTA_BASE_REUSE_NO, KIND_CHANGELOG, KIND_FILELOG, KIND_MANIFESTLOG, @@ -819,7 +820,7 @@ # through configuration. Disabling reuse source delta is useful when # we want to make sure we recomputed "optimal" deltas. debug_info = None - if cachedelta and revlog._generaldelta and revlog._lazydeltabase: + if cachedelta is not None and cachedelta[2] > DELTA_BASE_REUSE_NO: # Assume what we received from the server is a good choice # build delta will reuse the cache if debug_info is not None: