annotate tests/test-hgwebdir-paths.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 81455f482478
children 2372284d9457
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28932
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
1 from __future__ import absolute_import
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
2
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
3 import os
28932
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
4 from mercurial import (
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
5 hg,
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
6 ui as uimod,
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
7 )
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
8 from mercurial.hgweb import (
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
9 hgwebdir_mod,
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
10 )
4eac86331acb tests: make test-hgwebdir-paths use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 15381
diff changeset
11 hgwebdir = hgwebdir_mod.hgwebdir
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
12
37879
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
13 os.mkdir(b'webdir')
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
14 os.chdir(b'webdir')
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
15
37879
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
16 webdir = os.path.realpath(b'.')
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
17
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 28932
diff changeset
18 u = uimod.ui.load()
37879
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
19 hg.repository(u, b'a', create=1)
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
20 hg.repository(u, b'b', create=1)
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
21 os.chdir(b'b')
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
22 hg.repository(u, b'd', create=1)
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
23 os.chdir(b'..')
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
24 hg.repository(u, b'c', create=1)
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
25 os.chdir(b'..')
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
26
37879
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
27 paths = {b't/a/': b'%s/a' % webdir,
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
28 b'b': b'%s/b' % webdir,
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
29 b'coll': b'%s/*' % webdir,
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
30 b'rcoll': b'%s/**' % webdir}
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
31
37879
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
32 config = os.path.join(webdir, b'hgwebdir.conf')
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
33 configfile = open(config, 'wb')
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
34 configfile.write(b'[paths]\n')
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
35 for k, v in paths.items():
37879
81455f482478 tests: port test-hgwebdir-paths.py to Python 3
Augie Fackler <augie@google.com>
parents: 30559
diff changeset
36 configfile.write(b'%s = %s\n' % (k, v))
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
37 configfile.close()
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
38
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
39 confwd = hgwebdir(config)
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
40 dictwd = hgwebdir(paths)
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
41
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
42 assert len(confwd.repos) == len(dictwd.repos), 'different numbers'
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
43 assert len(confwd.repos) == 9, 'expected 9 repos, found %d' % len(confwd.repos)
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
44
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
45 found = dict(confwd.repos)
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
46 for key, path in dictwd.repos:
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
47 assert key in found, 'repository %s was not found' % key
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents:
diff changeset
48 assert found[key] == path, 'different paths for repo %s' % key