# HG changeset patch # User Pierre-Yves David # Date 1551260965 -3600 # Node ID f6eff9e4de80a901b2ae364c56bb639d1a6c58c5 # Parent 169c386cc9d8a6e00859e0cfab541628ace7c399 storage: introduce a `revlog.reuse-external-delta-parent` config As pointed in c59987ab96b4, we had no simple way to get a client to not blindly reuse the delta parent from a bundle. Instead one had to rely on a side effect of the deprecated `format.generaldelta` configuration. We introduce an explicit `revlog.reuse-external-delta-parent` configuration option (default to True) to control this behavior. If the option is not set, `format.generaldelta` still control this behavior. To test the new option, we convert a couple of place where `generaldelta` have been used for its side effects. diff -r 169c386cc9d8 -r f6eff9e4de80 mercurial/configitems.py --- a/mercurial/configitems.py Sat Mar 02 09:41:17 2019 +0900 +++ b/mercurial/configitems.py Wed Feb 27 10:49:25 2019 +0100 @@ -983,6 +983,9 @@ default=True, alias=[('format', 'aggressivemergedeltas')], ) +coreconfigitem('storage', 'revlog.reuse-external-delta-parent', + default=None, +) coreconfigitem('server', 'bookmarks-pushkey-compat', default=True, ) diff -r 169c386cc9d8 -r f6eff9e4de80 mercurial/help/config.txt --- a/mercurial/help/config.txt Sat Mar 02 09:41:17 2019 +0900 +++ b/mercurial/help/config.txt Wed Feb 27 10:49:25 2019 +0100 @@ -1843,6 +1843,28 @@ Turning this option off can result in large increase of repository size for repository with many merges. +``revlog.reuse-external-delta-parent`` + Control the order in which delta parents are considered when adding new + revisions from an external source. + (typically: apply bundle from `hg pull` or `hg push`). + + New revisions are usually provided as a delta against other revisions. By + default, Mercurial will try to reuse this delta first, therefore using the + same "delta parent" as the source. Directly using delta's from the source + reduces CPU usage and usually speeds up operation. However, in some case, + the source might have sub-optimal delta bases and forcing their reevaluation + is useful. For example, pushes from an old client could have sub-optimal + delta's parent that the server want to optimize. (lack of general delta, bad + parents, choice, lack of sparse-revlog, etc). + + This option is enabled by default. Turning it off will ensure bad delta + parent choices from older client do not propagate to this repository, at + the cost of a small increase in CPU consumption. + + Note: this option only control the order in which delta parents are + considered. Even when disabled, the existing delta from the source will be + reused if the same delta parent is selected. + ``server`` ---------- diff -r 169c386cc9d8 -r f6eff9e4de80 mercurial/localrepo.py --- a/mercurial/localrepo.py Sat Mar 02 09:41:17 2019 +0900 +++ b/mercurial/localrepo.py Wed Feb 27 10:49:25 2019 +0100 @@ -752,7 +752,11 @@ b'revlog.optimize-delta-parent-choice') options[b'deltabothparents'] = deltabothparents - options[b'lazydeltabase'] = not scmutil.gddeltaconfig(ui) + lazydeltabase = ui.configbool(b'storage', + b'revlog.reuse-external-delta-parent') + if lazydeltabase is None: + lazydeltabase = not scmutil.gddeltaconfig(ui) + options[b'lazydeltabase'] = lazydeltabase chainspan = ui.configbytes(b'experimental', b'maxdeltachainspan') if 0 <= chainspan: diff -r 169c386cc9d8 -r f6eff9e4de80 tests/test-generaldelta.t --- a/tests/test-generaldelta.t Sat Mar 02 09:41:17 2019 +0900 +++ b/tests/test-generaldelta.t Wed Feb 27 10:49:25 2019 +0100 @@ -339,7 +339,7 @@ 52 5 1 -1 base 369 640 369 0.57656 369 0 0.00000 53 6 1 -1 base 0 0 0 0.00000 0 0 0.00000 54 7 1 -1 base 369 640 369 0.57656 369 0 0.00000 - $ hg clone --pull source-repo --config experimental.maxdeltachainspan=0 noconst-chain --config format.generaldelta=yes + $ hg clone --pull source-repo --config experimental.maxdeltachainspan=0 noconst-chain --config format.usegeneraldelta=yes --config storage.revlog.reuse-external-delta-parent=no requesting all changes adding changesets adding manifests diff -r 169c386cc9d8 -r f6eff9e4de80 tests/test-sparse-revlog.t --- a/tests/test-sparse-revlog.t Sat Mar 02 09:41:17 2019 +0900 +++ b/tests/test-sparse-revlog.t Wed Feb 27 10:49:25 2019 +0100 @@ -40,8 +40,7 @@ > maxchainlen = 15 > [storage] > revlog.optimize-delta-parent-choice = yes - > [format] - > generaldelta = yes + > revlog.reuse-external-delta-parent = no > EOF $ hg init sparse-repo $ cd sparse-repo