persistent-nodemap: add a "warn" option to the slow-path config
authorPierre-Yves David <pierre-yves.david@octobus.net>
Wed, 13 Jan 2021 23:07:41 +0100
changeset 46310 fc2d5c0aed7f
parent 46309 2c9c88879ab7
child 46311 014ac7a32048
persistent-nodemap: add a "warn" option to the slow-path config And make it the default until we get an abort option. Differential Revision: https://phab.mercurial-scm.org/D9761
mercurial/configitems.py
mercurial/helptext/config.txt
mercurial/localrepo.py
mercurial/revlog.py
tests/test-persistent-nodemap.t
tests/test-share-safe.t
--- a/mercurial/configitems.py	Wed Jan 13 18:33:48 2021 +0100
+++ b/mercurial/configitems.py	Wed Jan 13 23:07:41 2021 +0100
@@ -1797,7 +1797,7 @@
 coreconfigitem(
     b'storage',
     b'revlog.persistent-nodemap.slow-path',
-    default=b"allow",
+    default=b"warn",
     experimental=True,
 )
 
--- a/mercurial/helptext/config.txt	Wed Jan 13 18:33:48 2021 +0100
+++ b/mercurial/helptext/config.txt	Wed Jan 13 23:07:41 2021 +0100
@@ -1959,8 +1959,9 @@
     the feature:
 
     ``allow``: Silently use the slower implementation to access the repository.
-
-    Default to "allow"
+    ``warn``: Warn, but use the slower implementation to access the repository.
+
+    Default to ``warn``
 
     For details on the "persistent-nodemap" feature, see:
     :hg:`help config format.use-persistent-nodemap`.
--- a/mercurial/localrepo.py	Wed Jan 13 18:33:48 2021 +0100
+++ b/mercurial/localrepo.py	Wed Jan 13 23:07:41 2021 +0100
@@ -59,6 +59,7 @@
     rcutil,
     repoview,
     requirements as requirementsmod,
+    revlog,
     revset,
     revsetlang,
     scmutil,
@@ -1047,7 +1048,7 @@
         slow_path = ui.config(
             b'storage', b'revlog.persistent-nodemap.slow-path'
         )
-        if slow_path not in (b'allow'):
+        if slow_path not in (b'allow', b'warn'):
             default = ui.config_default(
                 b'storage', b'revlog.persistent-nodemap.slow-path'
             )
@@ -1059,6 +1060,21 @@
             if not ui.quiet:
                 ui.warn(_(b'falling back to default value: %s\n') % default)
             slow_path = default
+
+        msg = _(
+            b"accessing `persistent-nodemap` repository without associated "
+            b"fast implementation."
+        )
+        hint = _(
+            b"check `hg help config.format.use-persistent-nodemap` "
+            b"for details"
+        )
+        if slow_path == b'warn' and not revlog.HAS_FAST_PERSISTENT_NODEMAP:
+            msg = b"warning: " + msg + b'\n'
+            ui.warn(msg)
+            if not ui.quiet:
+                hint = b'(' + hint + b')\n'
+                ui.warn(hint)
         options[b'persistent-nodemap'] = True
     if ui.configbool(b'storage', b'revlog.persistent-nodemap.mmap'):
         options[b'persistent-nodemap.mmap'] = True
--- a/mercurial/revlog.py	Wed Jan 13 18:33:48 2021 +0100
+++ b/mercurial/revlog.py	Wed Jan 13 23:07:41 2021 +0100
@@ -161,6 +161,16 @@
         rl.revision(node)
 
 
+# True if a fast implementation for persistent-nodemap is available
+#
+# We also consider we have a "fast" implementation in "pure" python because
+# people using pure don't really have performance consideration (and a
+# wheelbarrow of other slowness source)
+HAS_FAST_PERSISTENT_NODEMAP = rustrevlog is not None or util.safehasattr(
+    parsers, 'BaseIndexObject'
+)
+
+
 @attr.s(slots=True, frozen=True)
 class _revisioninfo(object):
     """Information about a revision that allows building its fulltext
--- a/tests/test-persistent-nodemap.t	Wed Jan 13 18:33:48 2021 +0100
+++ b/tests/test-persistent-nodemap.t	Wed Jan 13 23:07:41 2021 +0100
@@ -8,8 +8,30 @@
   > [devel]
   > persistent-nodemap=yes
   > EOF
-  $ hg init test-repo
+
+  $ hg init test-repo --config storage.revlog.persistent-nodemap.slow-path=allow
   $ cd test-repo
+
+Check handling of the default slow-path value
+
+#if no-pure no-rust
+
+  $ hg id
+  warning: accessing `persistent-nodemap` repository without associated fast implementation.
+  (check `hg help config.format.use-persistent-nodemap` for details)
+  000000000000 tip
+
+Unlock further check (we are here to test the feature)
+
+  $ cat << EOF >> $HGRCPATH
+  > [storage]
+  > # to avoid spamming the test
+  > revlog.persistent-nodemap.slow-path=allow
+  > EOF
+
+#endif
+
+
   $ hg debugformat
   format-variant     repo
   fncache:            yes
@@ -23,9 +45,8 @@
   plain-cl-delta:     yes
   compression:        zlib
   compression-level:  default
-  $ hg debugbuilddag .+5000 --new-file --config "storage.revlog.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 debugbuilddag .+5000 --new-file
+
   $ hg debugnodemap --metadata
   uid: ???????????????? (glob)
   tip-rev: 5000
@@ -116,11 +137,22 @@
 
   $ hg id --config "storage.revlog.persistent-nodemap.slow-path=invalid-value"
   unknown value for config "storage.revlog.persistent-nodemap.slow-path": "invalid-value"
-  falling back to default value: allow
+  falling back to default value: warn
+  warning: accessing `persistent-nodemap` repository without associated fast implementation. (no-pure no-rust !)
+  (check `hg help config.format.use-persistent-nodemap` for details) (no-pure no-rust !)
   6b02b8c7b966+ tip
 
 #if no-pure no-rust
 
+  $ hg log -r . --config "storage.revlog.persistent-nodemap.slow-path=warn"
+  warning: accessing `persistent-nodemap` repository without associated fast implementation.
+  (check `hg help config.format.use-persistent-nodemap` for details)
+  changeset:   5000:6b02b8c7b966
+  tag:         tip
+  user:        debugbuilddag
+  date:        Thu Jan 01 01:23:20 1970 +0000
+  summary:     r5000
+  
   $ hg ci -m 'foo' --config "storage.revlog.nodemap.mode=strict"
   transaction abort!
   rollback completed
--- a/tests/test-share-safe.t	Wed Jan 13 18:33:48 2021 +0100
+++ b/tests/test-share-safe.t	Wed Jan 13 23:07:41 2021 +0100
@@ -5,6 +5,8 @@
   > share =
   > [format]
   > exp-share-safe = True
+  > [storage]
+  > revlog.persistent-nodemap.slow-path=allow
   > EOF
 
 prepare source repo