view relnotes/5.6 @ 51108:0250e45040f1

revlog: add a small cache of unfiltered chunk This can provides a massive boost to the reading of multiple revision and the computation of a valid delta chain. This greatly help operation like `hg log --patch`, delta computation (helping pull/unbundle), linkrev adjustment (helping copy tracing). A first round of benchmark for `hg log --patch --limit 1000` shows improvement in the 10-20% range on "small" repository like pypy or mercurial and large improvements (about 33%) for more complex ones like netbeans and mozilla's. These speeds up are consistent with the improvement to `hg pull` (from a server sending poor deltas) I saw benchmarking this last year. Further benchmark will be run during the freeze. I added some configuration in the experimental space to be able to further test the effect of various tuning for now. This feature should fit well in the "usage/resource profile" configuration that we should land next cycle. When it does not provides a benefit the overhead of the cache seem to be around 2%, a small price for the big improvement. In addition I believe we could shave most of this overhead with a more efficent lru implementation.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 27 Oct 2023 08:54:41 +0200
parents 84eb4c833c41
children
line wrap: on
line source

== New Features ==

 * `hg mv -A` can now be used with `--at-rev`. It behaves just like
   `hg cp -A --at-rev`, i.e. it marks the destination as a copy of the
   source whether or not the source still exists (but the source must
   exist in the parent revision).

 * New revset predicate `diffcontains(pattern)` for filtering revisions
   in the same way as `hg grep --diff pattern`.

 * The memory footprint per changeset and per file during pull/unbundle
   operations has been significantly reduced.


== New Experimental Features ==



== Bug Fixes ==



== Backwards Compatibility Changes ==



== Internal API Changes ==

 * `merge.update()` is now private (renamed to `_update()`). Hopefully
   the higher-level functions available in the same module cover your
   use cases.

 * `phases.registernew` now takes a set of revisions instead of a list
   of nodes. `phases.advanceboundary` takes an optional set of revisions
   in addition to the list of nodes. The corresponeding members of the
   `phasecache` class follow this change.

 * The `addgroup` member of `revlog` classes no longer keeps a list of
   all found nodes. It now returns True iff a node was found in the group.
   An optional callback for duplicated nodes can be used by callers to keep
   track of all nodes themselve.

 * The `_chaininfocache` of `revlog` classes has been changed from a dict
   to a LRU cache.