annotate tests/test-walkrepo.py @ 42743:8c9a6adec67a

rust-discovery: using the children cache in add_missing The DAG range computation often needs to get back to very old revisions, and turns out to be disproportionately long, given that the end goal is to remove the descendents of the given missing revisons from the undecided set. The fast iteration capabilities available in the Rust case make it possible to avoid the DAG range entirely, at the cost of precomputing the children cache, and to simply iterate on children of the given missing revisions. This is a case where staying on the same side of the interface between the two languages has clear benefits. On discoveries with initial undecided sets small enough to bypass sampling entirely, the total cost of computing the children cache and the subsequent iteration becomes better than the Python + C counterpart, which relies on reachableroots2. For example, on a repo with more than one million revisions with an initial undecided set of 11 elements, we get these figures: Rust version with simple iteration addcommons: 57.287us first undecided computation: 184.278334ms first children cache computation: 131.056us addmissings iteration: 42.766us first addinfo total: 185.24 ms Python + C version first addcommons: 0.29 ms addcommons 0.21 ms first undecided computation 191.35 ms addmissings 45.75 ms first addinfo total: 237.77 ms On discoveries with large undecided sets, the initial price paid makes the first addinfo slower than the Python + C version, but that's more than compensated by the gain in sampling and subsequent iterations. Here's an extreme example with an undecided set of a million revisions: Rust version: first undecided computation: 293.842629ms first children cache computation: 407.911297ms addmissings iteration: 34.312869ms first addinfo total: 776.02 ms taking initial sample query 2: sampling time: 1318.38 ms query 2; still undecided: 1005013, sample size is: 200 addmissings: 143.062us Python + C version: first undecided computation 298.13 ms addmissings 80.13 ms first addinfo total: 399.62 ms taking initial sample query 2: sampling time: 3957.23 ms query 2; still undecided: 1005013, sample size is: 200 addmissings 52.88 ms Differential Revision: https://phab.mercurial-scm.org/D6428
author Georges Racinet <georges.racinet@octobus.net>
date Tue, 16 Apr 2019 01:16:39 +0200
parents fa2423acb02f
children 2372284d9457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
1 from __future__ import absolute_import, print_function
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
2
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
3 import os
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
4
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
5 from mercurial import (
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
6 hg,
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
7 scmutil,
28777
778d947f222e tests: alias ui as uimod in test-walkrepo
Yuya Nishihara <yuya@tcha.org>
parents: 28676
diff changeset
8 ui as uimod,
27300
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
9 util,
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
10 )
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
11
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
12 chdir = os.chdir
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
13 mkdir = os.mkdir
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
14 pjoin = os.path.join
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
15
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
16 walkrepos = scmutil.walkrepos
a8b2bf520a2a tests: use absolute_import in test-walkrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23532
diff changeset
17 checklink = util.checklink
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
18
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 28777
diff changeset
19 u = uimod.ui.load()
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
20 sym = checklink(b'.')
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
21
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
22 hg.repository(u, b'top1', create=1)
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
23 mkdir(b'subdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
24 chdir(b'subdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
25 hg.repository(u, b'sub1', create=1)
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
26 mkdir(b'subsubdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
27 chdir(b'subsubdir')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
28 hg.repository(u, b'subsub1', create=1)
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
29 chdir(os.path.pardir)
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
30 if sym:
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
31 os.symlink(os.path.pardir, b'circle')
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
32 os.symlink(pjoin(b'subsubdir', b'subsub1'), b'subsub1')
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
33
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
34 def runtest():
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
35 reposet = frozenset(walkrepos(b'.', followsym=True))
7494
85dc88630beb util: disable walkrepo() recursive behaviour
Patrick Mezard <pmezard@gmail.com>
parents: 7201
diff changeset
36 if sym and (len(reposet) != 3):
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
37 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
38 print(("Found %d repositories when I should have found 3"
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
39 % (len(reposet),)))
7494
85dc88630beb util: disable walkrepo() recursive behaviour
Patrick Mezard <pmezard@gmail.com>
parents: 7201
diff changeset
40 if (not sym) and (len(reposet) != 2):
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
41 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
42 print(("Found %d repositories when I should have found 2"
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
43 % (len(reposet),)))
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
44 sub1set = frozenset((pjoin(b'.', b'sub1'),
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
45 pjoin(b'.', b'circle', b'subdir', b'sub1')))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
46 if len(sub1set & reposet) != 1:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
47 print("sub1set = %r" % (sub1set,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
48 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
49 print("sub1set and reposet should have exactly one path in common.")
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
50 sub2set = frozenset((pjoin(b'.', b'subsub1'),
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
51 pjoin(b'.', b'subsubdir', b'subsub1')))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
52 if len(sub2set & reposet) != 1:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
53 print("sub2set = %r" % (sub2set,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
54 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
55 print("sub2set and reposet should have exactly one path in common.")
37878
fa2423acb02f tests: port test-walkrepo.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
56 sub3 = pjoin(b'.', b'circle', b'top1')
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 16683
diff changeset
57 if sym and sub3 not in reposet:
28676
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
58 print("reposet = %r" % (reposet,))
a4803f35efba py3: make test-walkrepo use print_function
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27300
diff changeset
59 print("Symbolic links are supported and %s is not in reposet" % (sub3,))
6341
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
60
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
61 runtest()
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
62 if sym:
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
63 # Simulate not having symlinks.
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
64 del os.path.samestat
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
65 sym = False
63bdfcc3eaaf test: Add tests for webdir symlinks and walkrepos.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
66 runtest()