sapling/tests/test-fb-hgext-treemanifest-treeonly-fetching.t
Durham Goode 93eb7cc993 treemanifest: set a hint commit hash for resolving base trees
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
2018-06-13 11:49:46 -07:00

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)