perf: add a `--clear-fnode-cache-rev` argument to perf::tags stable
authorPierre-Yves David <pierre-yves.david@octobus.net>
Thu, 22 Jun 2023 18:39:29 +0200
branchstable
changeset 50939 e4c4adb694f5
parent 50938 f02b62b7b056
child 50940 98a7f325eb5d
perf: add a `--clear-fnode-cache-rev` argument to perf::tags This will help us test this in situation closer to an update after a commit or a push.
contrib/perf.py
mercurial/tags.py
--- a/contrib/perf.py	Thu Jun 22 16:03:18 2023 +0200
+++ b/contrib/perf.py	Thu Jun 22 18:39:29 2023 +0200
@@ -894,6 +894,19 @@
     repo.cachevfs.tryunlink(tags._fnodescachefile)
 
 
+def _default_forget_fnodes(repo, revs):
+    """function used by the perf extension to prune some entries from the
+    fnodes cache"""
+    from mercurial import tags
+
+    missing_1 = b'\xff' * 4
+    missing_2 = b'\xff' * 20
+    cache = tags.hgtagsfnodescache(repo.unfiltered())
+    for r in revs:
+        cache._writeentry(r * tags._fnodesrecsize, missing_1, missing_2)
+    cache.write()
+
+
 @command(
     b'perf::tags|perftags',
     formatteropts
@@ -907,10 +920,17 @@
         ),
         (
             b'',
-            b'clear-fnode-cache',
+            b'clear-fnode-cache-all',
             False,
             b'clear on disk file node cache (DESTRUCTIVE),',
         ),
+        (
+            b'',
+            b'clear-fnode-cache-rev',
+            [],
+            b'clear on disk file node cache (DESTRUCTIVE),',
+            b'REVS',
+        ),
     ],
 )
 def perftags(ui, repo, **opts):
@@ -927,7 +947,9 @@
     repocleartagscache = repocleartagscachefunc(repo)
     clearrevlogs = opts[b'clear_revlogs']
     clear_disk = opts[b'clear_on_disk_cache']
-    clear_fnode = opts[b'clear_fnode_cache']
+    clear_fnode = opts[b'clear_fnode_cache_all']
+
+    clear_fnode_revs = opts[b'clear_fnode_cache_rev']
 
     clear_disk_fn = getattr(
         tags,
@@ -939,6 +961,15 @@
         "clear_cache_fnodes",
         _default_clear_on_disk_tags_fnodes_cache,
     )
+    clear_fnodes_rev_fn = getattr(
+        tags,
+        "forget_fnodes",
+        _default_forget_fnodes,
+    )
+
+    clear_revs = None
+    if clear_fnode_revs:
+        clear_revs = scmutil.revrange(repo, clear_fnode_revs)
 
     def s():
         if clearrevlogs:
@@ -948,6 +979,8 @@
             clear_disk_fn(repo)
         if clear_fnode:
             clear_fnodes_fn(repo)
+        elif clear_revs is not None:
+            clear_fnodes_rev_fn(repo, clear_revs)
         repocleartagscache()
 
     def t():
--- a/mercurial/tags.py	Thu Jun 22 16:03:18 2023 +0200
+++ b/mercurial/tags.py	Thu Jun 22 18:39:29 2023 +0200
@@ -920,3 +920,14 @@
 def clear_cache_fnodes(repo):
     """function used by the perf extension to clear "file node cache"""
     repo.cachevfs.tryunlink(_filename(repo))
+
+
+def forget_fnodes(repo, revs):
+    """function used by the perf extension to prune some entries from the fnodes
+    cache"""
+    missing_1 = b'\xff' * 4
+    missing_2 = b'\xff' * 20
+    cache = hgtagsfnodescache(repo.unfiltered())
+    for r in revs:
+        cache._writeentry(r * _fnodesrecsize, missing_1, missing_2)
+    cache.write()