changeset 44865:6493f0a567c2

nodemap: add a new mode option, with an optional "warn" value When "warn" is set, user will get notified when the slow code, used for compatibility is used. This can help people to detect situation were using that feature will give them a slowdown instead of a speedup. Differential Revision: https://phab.mercurial-scm.org/D8414
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 14 Apr 2020 02:45:05 +0200
parents 97ebdb192b00
children 6b01799e9db0
files mercurial/configitems.py mercurial/localrepo.py mercurial/revlogutils/nodemap.py tests/test-persistent-nodemap.t
diffstat 4 files changed, 18 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/configitems.py	Sun Apr 05 18:32:46 2020 +0200
+++ b/mercurial/configitems.py	Tue Apr 14 02:45:05 2020 +0200
@@ -681,6 +681,9 @@
     b'experimental', b'exp-persistent-nodemap.mmap', default=True,
 )
 coreconfigitem(
+    b'experimental', b'exp-persistent-nodemap.mode', default=b'compat',
+)
+coreconfigitem(
     b'experimental', b'server.filesdata.recommended-batch-size', default=50000,
 )
 coreconfigitem(
--- a/mercurial/localrepo.py	Sun Apr 05 18:32:46 2020 +0200
+++ b/mercurial/localrepo.py	Tue Apr 14 02:45:05 2020 +0200
@@ -937,6 +937,8 @@
         options[b'exp-persistent-nodemap'] = True
     if ui.configbool(b'experimental', b'exp-persistent-nodemap.mmap'):
         options[b'exp-persistent-nodemap.mmap'] = True
+    epnm = ui.config(b'experimental', b'exp-persistent-nodemap.mode')
+    options[b'exp-persistent-nodemap.mode'] = epnm
     if ui.configbool(b'devel', b'persistent-nodemap'):
         options[b'devel-force-nodemap'] = True
 
--- a/mercurial/revlogutils/nodemap.py	Sun Apr 05 18:32:46 2020 +0200
+++ b/mercurial/revlogutils/nodemap.py	Tue Apr 14 02:45:05 2020 +0200
@@ -13,6 +13,8 @@
 import re
 import struct
 
+from ..i18n import _
+
 from .. import (
     error,
     node as nodemod,
@@ -105,6 +107,9 @@
     def addabort(self, *args, **kwargs):
         pass
 
+    def _report(self, *args):
+        pass
+
 
 def update_persistent_nodemap(revlog):
     """update the persistent nodemap right now
@@ -138,6 +143,11 @@
     ondisk_docket = revlog._nodemap_docket
     feed_data = util.safehasattr(revlog.index, "update_nodemap_data")
     use_mmap = revlog.opener.options.get(b"exp-persistent-nodemap.mmap")
+    mode = revlog.opener.options.get(b"exp-persistent-nodemap.mode")
+    if not can_incremental:
+        msg = _(b"persistent nodemap in strict mode without efficient method")
+        if mode == b'warn':
+            tr._report(b"%s\n" % msg)
 
     data = None
     # first attemp an incremental update of the data
--- a/tests/test-persistent-nodemap.t	Sun Apr 05 18:32:46 2020 +0200
+++ b/tests/test-persistent-nodemap.t	Tue Apr 14 02:45:05 2020 +0200
@@ -10,7 +10,9 @@
   > [devel]
   > persistent-nodemap=yes
   > EOF
-  $ hg debugbuilddag .+5000 --new-file
+  $ hg debugbuilddag .+5000 --new-file --config "experimental.exp-persistent-nodemap.mode=warn"
+  persistent nodemap in strict mode without efficient method (no-rust no-pure !)
+  persistent nodemap in strict mode without efficient method (no-rust no-pure !)
   $ hg debugnodemap --metadata
   uid: ???????????????? (glob)
   tip-rev: 5000