Patchwork D9761: persistent-nodemap: add a "warn" option to the slow-path config

login
register
mail settings
Submitter phabricator
Date Jan. 14, 2021, 4:07 a.m.
Message ID <differential-rev-PHID-DREV-kbvyogghyz4ie6z2vquh-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/48076/
State Superseded
Headers show

Comments

phabricator - Jan. 14, 2021, 4:07 a.m.
marmoute created this revision.
Herald added a reviewer: indygreg.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  And make it the default until we get an abort option.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9761

AFFECTED FILES
  mercurial/configitems.py
  mercurial/helptext/config.txt
  mercurial/localrepo.py
  mercurial/revlog.py
  tests/test-persistent-nodemap.t

CHANGE DETAILS




To: marmoute, indygreg, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-persistent-nodemap.t b/tests/test-persistent-nodemap.t
--- a/tests/test-persistent-nodemap.t
+++ b/tests/test-persistent-nodemap.t
@@ -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
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -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
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -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
diff --git a/mercurial/helptext/config.txt b/mercurial/helptext/config.txt
--- a/mercurial/helptext/config.txt
+++ b/mercurial/helptext/config.txt
@@ -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`.
diff --git a/mercurial/configitems.py b/mercurial/configitems.py
--- a/mercurial/configitems.py
+++ b/mercurial/configitems.py
@@ -1782,7 +1782,7 @@ 
 coreconfigitem(
     b'storage',
     b'revlog.persistent-nodemap.slow-path',
-    default=b"allow",
+    default=b"warn",
     experimental=True,
 )