# HG changeset patch # User Pierre-Yves David # Date 1687442598 -7200 # Node ID f02b62b7b056e2fc4d899deac2fae7c1453c4fb6 # Parent 04bfcb41674503405a781de444034716843431f9 perf: introduce more cache invalidation option in perf::tags This will help us to assert the performance of different versions in more diverse situations. We introduce helper function in the tags module in case invalidating such cache becomes different in the future. diff -r 04bfcb416745 -r f02b62b7b056 contrib/perf.py --- a/contrib/perf.py Fri Sep 08 15:33:03 2023 +0200 +++ b/contrib/perf.py Thu Jun 22 16:03:18 2023 +0200 @@ -882,23 +882,72 @@ fm.end() +def _default_clear_on_disk_tags_cache(repo): + from mercurial import tags + + repo.cachevfs.tryunlink(tags._filename(repo)) + + +def _default_clear_on_disk_tags_fnodes_cache(repo): + from mercurial import tags + + repo.cachevfs.tryunlink(tags._fnodescachefile) + + @command( b'perf::tags|perftags', formatteropts + [ (b'', b'clear-revlogs', False, b'refresh changelog and manifest'), + ( + b'', + b'clear-on-disk-cache', + False, + b'clear on disk tags cache (DESTRUCTIVE)', + ), + ( + b'', + b'clear-fnode-cache', + False, + b'clear on disk file node cache (DESTRUCTIVE),', + ), ], ) def perftags(ui, repo, **opts): + """Benchmark tags retrieval in various situation + + The option marked as (DESTRUCTIVE) will alter the on-disk cache, possibly + altering performance after the command was run. However, it does not + destroy any stored data. + """ + from mercurial import tags + opts = _byteskwargs(opts) timer, fm = gettimer(ui, opts) repocleartagscache = repocleartagscachefunc(repo) clearrevlogs = opts[b'clear_revlogs'] + clear_disk = opts[b'clear_on_disk_cache'] + clear_fnode = opts[b'clear_fnode_cache'] + + clear_disk_fn = getattr( + tags, + "clear_cache_on_disk", + _default_clear_on_disk_tags_cache, + ) + clear_fnodes_fn = getattr( + tags, + "clear_cache_fnodes", + _default_clear_on_disk_tags_fnodes_cache, + ) def s(): if clearrevlogs: clearchangelog(repo) clearfilecache(repo.unfiltered(), 'manifest') + if clear_disk: + clear_disk_fn(repo) + if clear_fnode: + clear_fnodes_fn(repo) repocleartagscache() def t(): diff -r 04bfcb416745 -r f02b62b7b056 mercurial/tags.py --- a/mercurial/tags.py Fri Sep 08 15:33:03 2023 +0200 +++ b/mercurial/tags.py Thu Jun 22 16:03:18 2023 +0200 @@ -910,3 +910,13 @@ ) finally: lock.release() + + +def clear_cache_on_disk(repo): + """function used by the perf extension to "tags" cache""" + repo.cachevfs.tryunlink(_filename(repo)) + + +def clear_cache_fnodes(repo): + """function used by the perf extension to clear "file node cache""" + repo.cachevfs.tryunlink(_filename(repo)) diff -r 04bfcb416745 -r f02b62b7b056 tests/test-contrib-perf.t --- a/tests/test-contrib-perf.t Fri Sep 08 15:33:03 2023 +0200 +++ b/tests/test-contrib-perf.t Thu Jun 22 16:03:18 2023 +0200 @@ -194,7 +194,7 @@ benchmark the full generation of a stream clone perf::stream-locked-section benchmark the initial, repo-locked, section of a stream-clone - perf::tags (no help text available) + perf::tags Benchmark tags retrieval in various situation perf::templating test the rendering time of a given template perf::unbundle