Mercurial > hg
annotate tests/test-merge10.t @ 29830:92ac2baaea86
revlog: use an LRU cache for delta chain bases
Profiling using statprof revealed a hotspot during changegroup
application calculating delta chain bases on generaldelta repos.
Essentially, revlog._addrevision() was performing a lot of redundant
work tracing the delta chain as part of determining when the chain
distance was acceptable. This was most pronounced when adding
revisions to manifests, which can have delta chains thousands of
revisions long.
There was a delta chain base cache on revlogs before, but it only
captured a single revision. This was acceptable before generaldelta,
when _addrevision would build deltas from the previous revision and
thus we'd pretty much guarantee a cache hit when resolving the delta
chain base on a subsequent _addrevision call. However, it isn't
suitable for generaldelta because parent revisions aren't necessarily
the last processed revision.
This patch converts the delta chain base cache to an LRU dict cache.
The cache can hold multiple entries, so generaldelta repos have a
higher chance of getting a cache hit.
The impact of this change when processing changegroup additions is
significant. On a generaldelta conversion of the "mozilla-unified"
repo (which contains heads of the main Firefox repositories in
chronological order - this means there are lots of transitions between
heads in revlog order), this change has the following impact when
performing an `hg unbundle` of an uncompressed bundle of the repo:
before: 5:42 CPU time
after: 4:34 CPU time
Most of this time is saved when applying the changelog and manifest
revlogs:
before: 2:30 CPU time
after: 1:17 CPU time
That nearly a 50% reduction in CPU time applying changesets and
manifests!
Applying a gzipped bundle of the same repo (effectively simulating a
`hg clone` over HTTP) showed a similar speedup:
before: 5:53 CPU time
after: 4:46 CPU time
Wall time improvements were basically the same as CPU time.
I didn't measure explicitly, but it feels like most of the time
is saved when processing manifests. This makes sense, as large
manifests tend to have very long delta chains and thus benefit the
most from this cache.
So, this change effectively makes changegroup application (which is
used by `hg unbundle`, `hg clone`, `hg pull`, `hg unshelve`, and
various other commands) significantly faster when delta chains are
long (which can happen on repos with large numbers of files and thus
large manifests).
In theory, this change can result in more memory utilization. However,
we're caching a dict of ints. At most we have 200 ints + Python object
overhead per revlog. And, the cache is really only populated when
performing read-heavy operations, such as adding changegroups or
scanning an individual revlog. For memory bloat to be an issue, we'd
need to scan/read several revisions from several revlogs all while
having active references to several revlogs. I don't think there are
many operations that do this, so I don't think memory bloat from the
cache will be an issue.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Mon, 22 Aug 2016 21:48:50 -0700 |
parents | f2719b387380 |
children | eb586ed5d8ce |
rev | line source |
---|---|
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
1 Test for changeset 9fe267f77f56ff127cf7e65dc15dd9de71ce8ceb |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
2 (merge correctly when all the files in a directory are moved |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
3 but then local changes are added in the same directory) |
4696
59b8f9361545
tests: add merge test for changeset 9fe267f77f56
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
diff
changeset
|
4 |
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
5 $ hg init a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
6 $ cd a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
7 $ mkdir -p testdir |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
8 $ echo a > testdir/a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
9 $ hg add testdir/a |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11983
diff
changeset
|
10 $ hg commit -m a |
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
11 $ cd .. |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
12 |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
13 $ hg clone a b |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
14 updating to branch default |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
15 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
16 $ cd a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
17 $ echo alpha > testdir/a |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11983
diff
changeset
|
18 $ hg commit -m remote-change |
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
19 $ cd .. |
4696
59b8f9361545
tests: add merge test for changeset 9fe267f77f56
Giorgos Keramidas <keramida@ceid.upatras.gr>
parents:
diff
changeset
|
20 |
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
21 $ cd b |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
22 $ mkdir testdir/subdir |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
23 $ hg mv testdir/a testdir/subdir/a |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11983
diff
changeset
|
24 $ hg commit -m move |
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
25 $ mkdir newdir |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
26 $ echo beta > newdir/beta |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
27 $ hg add newdir/beta |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11983
diff
changeset
|
28 $ hg commit -m local-addition |
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
29 $ hg pull ../a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
30 pulling from ../a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
31 searching for changes |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
32 adding changesets |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
33 adding manifests |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
34 adding file changes |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
35 added 1 changesets with 1 changes to 1 files (+1 heads) |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
36 (run 'hg heads' to see heads, 'hg merge' to merge) |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
37 $ hg up -C 2 |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
38 0 files updated, 0 files merged, 0 files removed, 0 files unresolved |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
39 $ hg merge |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
40 merging testdir/subdir/a and testdir/a to testdir/subdir/a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
41 0 files updated, 1 files merged, 0 files removed, 0 files unresolved |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
42 (branch merge, don't forget to commit) |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
43 $ hg stat |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
44 M testdir/subdir/a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
45 $ hg diff --nodates |
12156
4c94b6d0fb1c
tests: remove unneeded -d flags
Martin Geisler <mg@lazybytes.net>
parents:
11983
diff
changeset
|
46 diff -r bc21c9773bfa testdir/subdir/a |
11983
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
47 --- a/testdir/subdir/a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
48 +++ b/testdir/subdir/a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
49 @@ -1,1 +1,1 @@ |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
50 -a |
27649cf258e3
tests: unify test-merge10
Pradeepkumar Gayam <in3xes@gmail.com>
parents:
8168
diff
changeset
|
51 +alpha |
16913
f2719b387380
tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents:
12156
diff
changeset
|
52 |
f2719b387380
tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents:
12156
diff
changeset
|
53 $ cd .. |