Mercurial > hg
view tests/test-ssh-repoerror.t @ 47120:7109a38830c9
dirstate-tree: Fold "tracked descendants" counter update in main walk
For the purpose of implementing `has_tracked_dir` (which means "has tracked
descendants) without an expensive sub-tree traversal, we maintaing a counter
of tracked descendants on each "directory" node of the tree-shaped dirstate.
Before this changeset, mutating or inserting a node at a given path would
involve:
* Walking the tree from root through ancestors to find the node or the spot
where to insert it
* Looking at the previous node if any to decide what counter update is needed
* Performing any node mutation
* Walking the tree *again* to update counters in ancestor nodes
When profiling `hg status` on a large repo, this second walk takes times
while loading a the dirstate from disk.
It turns out we have enough information to decide before he first tree walk
what counter update is needed. This changeset merges the two walks, gaining
~10% of the total time for `hg update` (in the same hyperfine benchmark as
the previous changeset).
---
Profiling was done by compiling with this `.cargo/config`:
[profile.release]
debug = true
then running with:
py-spy record -r 500 -n -o /tmp/hg.json --format speedscope -- \
./hg status -R $REPO --config experimental.dirstate-tree.in-memory=1
then visualizing the recorded JSON file in https://www.speedscope.app/
Differential Revision: https://phab.mercurial-scm.org/D10554
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 30 Apr 2021 14:22:14 +0200 |
parents | 95c4cca641f6 |
children | be496e3489b9 |
line wrap: on
line source
#require unix-permissions no-root initial setup $ cat << EOF >> $HGRCPATH > [ui] > ssh="$PYTHON" "$TESTDIR/dummyssh" > EOF repository itself is non-readable --------------------------------- $ hg init no-read $ hg id ssh://user@dummy/no-read 000000000000 $ chmod a-rx no-read $ hg id ssh://user@dummy/no-read remote: abort: Permission denied: *$TESTTMP/no-read/.hg* (glob) abort: no suitable response from remote hg [255] special case files are visible, but unreadable ---------------------------------------------- This is "similar" to the test above, but the directory is "traversable". This seems an unexpected case in real life, but we test it anyway. $ hg init other $ hg id ssh://user@dummy/other 000000000000 $ for item in `find other | sort -r` ; do > chmod a-r $item > done $ hg id ssh://user@dummy/other remote: abort: Permission denied: '$TESTTMP/other/.hg/requires' abort: no suitable response from remote hg [255] directory toward the repository is read only -------------------------------------------- $ mkdir deep $ hg init deep/nested $ hg id ssh://user@dummy/deep/nested 000000000000 $ chmod a-rx deep $ hg id ssh://user@dummy/deep/nested remote: abort: Permission denied: *$TESTTMP/deep/nested/.hg* (glob) abort: no suitable response from remote hg [255] repository has wrong requirement -------------------------------- $ hg init repo-future $ hg id ssh://user@dummy/repo-future 000000000000 $ echo flying-car >> repo-future/.hg/requires $ hg id ssh://user@dummy/repo-future remote: abort: repository requires features unknown to this Mercurial: flying-car remote: (see https://mercurial-scm.org/wiki/MissingRequirement for more information) abort: no suitable response from remote hg [255]