# HG changeset patch # User Pierre-Yves David # Date 1669117462 -3600 # Node ID 45d7b8c380d752739e4c3eb402bcae3840330e94 # Parent 7aea9babac5d4aad486396f1d765464ce45b767c changelog-v2: add a configuration to disable rank computation We encountered a graph where rank computation was pathologically slow. We add an option to disable this computation while this is getting fixed. Disabling the rank computation should allow for testing other changelog-v2 features undisturbed (like changeset-based copy tracing). I am purposely not adding a test for the new non-default code path, as this is a temporary work around of an experimental feature. diff -r 7aea9babac5d -r 45d7b8c380d7 mercurial/configitems.py --- a/mercurial/configitems.py Mon Nov 21 15:04:19 2022 +0100 +++ b/mercurial/configitems.py Tue Nov 22 12:44:22 2022 +0100 @@ -923,6 +923,13 @@ b'changegroup4', default=False, ) + +# might remove rank configuration once the computation has no impact +coreconfigitem( + b'experimental', + b'changelog-v2.compute-rank', + default=True, +) coreconfigitem( b'experimental', b'cleanup-as-archived', diff -r 7aea9babac5d -r 45d7b8c380d7 mercurial/localrepo.py --- a/mercurial/localrepo.py Mon Nov 21 15:04:19 2022 +0100 +++ b/mercurial/localrepo.py Tue Nov 22 12:44:22 2022 +0100 @@ -1068,6 +1068,8 @@ options[b'revlogv2'] = True if requirementsmod.CHANGELOGV2_REQUIREMENT in requirements: options[b'changelogv2'] = True + cmp_rank = ui.configbool(b'experimental', b'changelog-v2.compute-rank') + options[b'changelogv2.compute-rank'] = cmp_rank if requirementsmod.GENERALDELTA_REQUIREMENT in requirements: options[b'generaldelta'] = True diff -r 7aea9babac5d -r 45d7b8c380d7 mercurial/revlog.py --- a/mercurial/revlog.py Mon Nov 21 15:04:19 2022 +0100 +++ b/mercurial/revlog.py Tue Nov 22 12:44:22 2022 +0100 @@ -365,6 +365,11 @@ self._srdensitythreshold = 0.50 self._srmingapsize = 262144 + # other optionnals features + + # might remove rank configuration once the computation has no impact + self._compute_rank = False + # Make copy of flag processors so each revlog instance can support # custom flags. self._flagprocessors = dict(flagutil.flagprocessors) @@ -406,6 +411,7 @@ if b'changelogv2' in opts and self.revlog_kind == KIND_CHANGELOG: new_header = CHANGELOGV2 + self._compute_rank = opts.get(b'changelogv2.compute-rank', True) elif b'revlogv2' in opts: new_header = REVLOGV2 elif b'revlogv1' in opts: @@ -2499,7 +2505,7 @@ sidedata_offset = 0 rank = RANK_UNKNOWN - if self._format_version == CHANGELOGV2: + if self._compute_rank: if (p1r, p2r) == (nullrev, nullrev): rank = 1 elif p1r != nullrev and p2r == nullrev: