mirror of
https://github.com/facebook/sapling.git
synced 2024-10-12 17:58:27 +03:00
93eb7cc993
Summary: When requesting trees from the server we try to provide a base tree that we already have. In the hybrid manifest days, when we were fetching manifest X, we would look up the linknode for X in the flat manifest revlog, then scan the changelog up and down from that linknode. In the treeonly world we don't have that revlog anymore though, so the current algorithm just searches from the tip. This ended up being a really bad algorithm, since if you have tip and you request tip~1000, then tip~2000, then tip~3000, you end up basing them all against tip and redownloading a lot of data. This makes hg blame and hg log -p super slow. Let's change the algorithm to base off of a hint linknode, and let's change changectx to set that hint every time it attempts to read a manifest. In manual testing this significantly sped up hg log -p Reviewed By: phillco Differential Revision: D8399613 fbshipit-source-id: 771a94ee8b82be682ea0091b8d6c0fcd5f4e6646
71 lines
1.9 KiB
Perl
71 lines
1.9 KiB
Perl
$ . "$TESTDIR/library.sh"
|
|
|
|
Setup the server
|
|
|
|
$ hginit master
|
|
$ cd master
|
|
$ cat >> .hg/hgrc <<EOF
|
|
> [extensions]
|
|
> treemanifest=
|
|
> [treemanifest]
|
|
> server=True
|
|
> treeonly=True
|
|
> [remotefilelog]
|
|
> server=True
|
|
> shallowtrees=True
|
|
> EOF
|
|
|
|
Setup the client
|
|
|
|
$ cd ..
|
|
$ hgcloneshallow ssh://user@dummy/master client -q --config treemanifest.treeonly=True
|
|
$ cd client
|
|
$ cat >> .hg/hgrc <<EOF
|
|
> [extensions]
|
|
> treemanifest=
|
|
> fastmanifest=
|
|
>
|
|
> [treemanifest]
|
|
> sendtrees=True
|
|
> treeonly=True
|
|
>
|
|
> [fastmanifest]
|
|
> usetree=True
|
|
> usecache=False
|
|
>
|
|
> [remotefilelog]
|
|
> reponame=treeonlyrepo
|
|
> EOF
|
|
|
|
Make some commits
|
|
|
|
$ cd ../master
|
|
$ mkdir subdir
|
|
$ echo a >> subdir/foo
|
|
$ hg commit -Aqm 'a > subdir/foo'
|
|
$ echo b >> subdir/foo
|
|
$ hg commit -Aqm 'b >> subdir/foo'
|
|
$ echo c >> subdir/foo
|
|
$ hg commit -Aqm 'c >> subdir/foo'
|
|
$ echo d >> subdir/foo
|
|
$ hg commit -Aqm 'd >> subdir/foo'
|
|
|
|
Test that log -p downloads each tree using the prior tree as a base
|
|
|
|
$ cd ../client
|
|
$ hg pull -q
|
|
$ hg up tip
|
|
fetching tree '' f50e2ff15ddef5802543b56b0b84d742512e90f0, found via 3b158baa90a6
|
|
2 trees fetched over * (glob)
|
|
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
|
|
1 files fetched over 1 fetches - (1 misses, 0.00% hit ratio) over * (glob)
|
|
|
|
$ hg log -p 1>/dev/null
|
|
fetching tree '' 88dd1b582645feb893f44bd3b20947ff2d275360, based on f50e2ff15ddef5802543b56b0b84d742512e90f0, found via 2f885f603416
|
|
2 trees fetched over * (glob)
|
|
fetching tree '' d09a7a1172be7d3c00d4bc16831b6394d11ce33f, based on 88dd1b582645feb893f44bd3b20947ff2d275360, found via 6bfefea56efe
|
|
2 trees fetched over * (glob)
|
|
fetching tree '' 1b3e02c1b4460e2d6264781579eb163e76cffad4, based on d09a7a1172be7d3c00d4bc16831b6394d11ce33f
|
|
2 trees fetched over * (glob)
|
|
3 files fetched over 3 fetches - (3 misses, 0.00% hit ratio) over * (glob)
|