mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 09:17:30 +03:00
75fa0e5ea9
Adds a new discovery method based on repeatedly sampling the still undecided subset of the local node graph to determine the set of nodes common to both the client and the server. For small differences between client and server, it uses about the same or slightly fewer roundtrips than the old tree-based discovery. For larger differences, it typically reduces the number of roundtrips drastically (from 150 to 4, for instance). The old discovery code now lives in treediscovery.py, the new code is in setdiscovery.py. Still missing is a hook for extensions to contribute nodes to the initial sample. For instance, Augie's remotebranches could contribute the last known state of the server's heads. Credits for the actual sampler and computing common heads instead of bases go to Benoit Boissinot.
272 lines
5.8 KiB
Turing
272 lines
5.8 KiB
Turing
|
|
Function to test discovery between two repos in both directions, using both the local shortcut
|
|
(which is currently not activated by default) and the full remotable protocol:
|
|
|
|
$ testdesc() { # revs_a, revs_b, dagdesc
|
|
> if [ -e foo ]; then rm -rf foo; fi
|
|
> hg init foo
|
|
> cd foo
|
|
> hg debugbuilddag "$3"
|
|
> hg clone . a $1 --quiet
|
|
> hg clone . b $2 --quiet
|
|
> echo
|
|
> echo "% -- a -> b tree"
|
|
> hg -R a debugdiscovery b --verbose --old
|
|
> echo
|
|
> echo "% -- a -> b set"
|
|
> hg -R a debugdiscovery b --verbose --debug
|
|
> echo
|
|
> echo "% -- b -> a tree"
|
|
> hg -R b debugdiscovery a --verbose --old
|
|
> echo
|
|
> echo "% -- b -> a set"
|
|
> hg -R b debugdiscovery a --verbose --debug
|
|
> cd ..
|
|
> }
|
|
|
|
|
|
Small superset:
|
|
|
|
$ testdesc '-ra1 -ra2' '-rb1 -rb2 -rb3' '
|
|
> +2:f +1:a1:b1
|
|
> <f +4 :a2
|
|
> +5 :b2
|
|
> <f +3 :b3'
|
|
|
|
% -- a -> b tree
|
|
comparing with b
|
|
searching for changes
|
|
unpruned common: b5714e113bc0 66f7d451a68b 01241442b3c2
|
|
common heads: b5714e113bc0 01241442b3c2
|
|
local is subset
|
|
|
|
% -- a -> b set
|
|
comparing with b
|
|
query 1; heads
|
|
searching for changes
|
|
taking initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 4, sample size is: 4
|
|
2 total queries
|
|
common heads: b5714e113bc0 01241442b3c2
|
|
local is subset
|
|
|
|
% -- b -> a tree
|
|
comparing with a
|
|
searching for changes
|
|
unpruned common: b5714e113bc0 01241442b3c2
|
|
common heads: b5714e113bc0 01241442b3c2
|
|
remote is subset
|
|
|
|
% -- b -> a set
|
|
comparing with a
|
|
query 1; heads
|
|
searching for changes
|
|
all remote heads known locally
|
|
common heads: b5714e113bc0 01241442b3c2
|
|
remote is subset
|
|
|
|
|
|
Many new:
|
|
|
|
$ testdesc '-ra1 -ra2' '-rb' '
|
|
> +2:f +3:a1 +3:b
|
|
> <f +30 :a2'
|
|
|
|
% -- a -> b tree
|
|
comparing with b
|
|
searching for changes
|
|
unpruned common: bebd167eb94d
|
|
common heads: bebd167eb94d
|
|
|
|
% -- a -> b set
|
|
comparing with b
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 35, sample size is: 35
|
|
2 total queries
|
|
common heads: bebd167eb94d
|
|
|
|
% -- b -> a tree
|
|
comparing with a
|
|
searching for changes
|
|
unpruned common: bebd167eb94d 66f7d451a68b
|
|
common heads: bebd167eb94d
|
|
|
|
% -- b -> a set
|
|
comparing with a
|
|
query 1; heads
|
|
searching for changes
|
|
taking initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 3, sample size is: 3
|
|
2 total queries
|
|
common heads: bebd167eb94d
|
|
|
|
|
|
Both sides many new with stub:
|
|
|
|
$ testdesc '-ra1 -ra2' '-rb' '
|
|
> +2:f +2:a1 +30 :b
|
|
> <f +30 :a2'
|
|
|
|
% -- a -> b tree
|
|
comparing with b
|
|
searching for changes
|
|
unpruned common: 2dc09a01254d
|
|
common heads: 2dc09a01254d
|
|
|
|
% -- a -> b set
|
|
comparing with b
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 34, sample size is: 34
|
|
2 total queries
|
|
common heads: 2dc09a01254d
|
|
|
|
% -- b -> a tree
|
|
comparing with a
|
|
searching for changes
|
|
unpruned common: 66f7d451a68b 2dc09a01254d
|
|
common heads: 2dc09a01254d
|
|
|
|
% -- b -> a set
|
|
comparing with a
|
|
query 1; heads
|
|
searching for changes
|
|
taking initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 30, sample size is: 30
|
|
2 total queries
|
|
common heads: 2dc09a01254d
|
|
|
|
|
|
Both many new:
|
|
|
|
$ testdesc '-ra' '-rb' '
|
|
> +2:f +30 :b
|
|
> <f +30 :a'
|
|
|
|
% -- a -> b tree
|
|
comparing with b
|
|
searching for changes
|
|
unpruned common: 66f7d451a68b
|
|
common heads: 66f7d451a68b
|
|
|
|
% -- a -> b set
|
|
comparing with b
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 32, sample size is: 32
|
|
2 total queries
|
|
common heads: 66f7d451a68b
|
|
|
|
% -- b -> a tree
|
|
comparing with a
|
|
searching for changes
|
|
unpruned common: 66f7d451a68b
|
|
common heads: 66f7d451a68b
|
|
|
|
% -- b -> a set
|
|
comparing with a
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 32, sample size is: 32
|
|
2 total queries
|
|
common heads: 66f7d451a68b
|
|
|
|
|
|
Both many new skewed:
|
|
|
|
$ testdesc '-ra' '-rb' '
|
|
> +2:f +30 :b
|
|
> <f +50 :a'
|
|
|
|
% -- a -> b tree
|
|
comparing with b
|
|
searching for changes
|
|
unpruned common: 66f7d451a68b
|
|
common heads: 66f7d451a68b
|
|
|
|
% -- a -> b set
|
|
comparing with b
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 52, sample size is: 52
|
|
2 total queries
|
|
common heads: 66f7d451a68b
|
|
|
|
% -- b -> a tree
|
|
comparing with a
|
|
searching for changes
|
|
unpruned common: 66f7d451a68b
|
|
common heads: 66f7d451a68b
|
|
|
|
% -- b -> a set
|
|
comparing with a
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 32, sample size is: 32
|
|
2 total queries
|
|
common heads: 66f7d451a68b
|
|
|
|
|
|
Both many new on top of long history:
|
|
|
|
$ testdesc '-ra' '-rb' '
|
|
> +1000:f +30 :b
|
|
> <f +50 :a'
|
|
|
|
% -- a -> b tree
|
|
comparing with b
|
|
searching for changes
|
|
unpruned common: 7ead0cba2838
|
|
common heads: 7ead0cba2838
|
|
|
|
% -- a -> b set
|
|
comparing with b
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 1050, sample size is: 11
|
|
sampling from both directions
|
|
searching: 3 queries
|
|
query 3; still undecided: 31, sample size is: 31
|
|
3 total queries
|
|
common heads: 7ead0cba2838
|
|
|
|
% -- b -> a tree
|
|
comparing with a
|
|
searching for changes
|
|
unpruned common: 7ead0cba2838
|
|
common heads: 7ead0cba2838
|
|
|
|
% -- b -> a set
|
|
comparing with a
|
|
query 1; heads
|
|
searching for changes
|
|
taking quick initial sample
|
|
searching: 2 queries
|
|
query 2; still undecided: 1030, sample size is: 11
|
|
sampling from both directions
|
|
searching: 3 queries
|
|
query 3; still undecided: 16, sample size is: 16
|
|
3 total queries
|
|
common heads: 7ead0cba2838
|
|
|
|
|
|
|