Mercurial > hg
annotate tests/test-update-names.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 | b33c0c38d68f |
children | 90a6c18a7c1d |
rev | line source |
---|---|
29480
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
1 Test update logic when there are renames or weird same-name cases between dirs |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
2 and files |
10874
4f11978ae45d
copies: properly visit file context ancestors on working file contexts
Henrik Stuart <henrik.stuart@edlund.dk>
parents:
diff
changeset
|
3 |
12328
b63f6422d2a7
tests: fix a bunch of pointless #s in unified tests
Matt Mackall <mpm@selenic.com>
parents:
12316
diff
changeset
|
4 Update with local changes across a file rename |
12299
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
5 |
29480
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
6 $ hg init r1 && cd r1 |
12299
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
7 |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
8 $ echo a > a |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
9 $ hg add a |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
10 $ hg ci -m a |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
11 |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
12 $ hg mv a b |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
13 $ hg ci -m rename |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
14 |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
15 $ echo b > b |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
16 $ hg ci -m change |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
17 |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
18 $ hg up -q 0 |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
19 |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
20 $ echo c > a |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
21 |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
22 $ hg up |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
23 merging a and b to b |
26614
ef1eb6df7071
simplemerge: move conflict warning message to filemerge
Siddharth Agarwal <sid0@fb.com>
parents:
16911
diff
changeset
|
24 warning: conflicts while merging b! (edit, then use 'hg resolve --mark') |
12299
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
25 0 files updated, 0 files merged, 0 files removed, 1 files unresolved |
a73684df0f8a
tests: unify test-update-renames
Adrian Buehlmann <adrian@cadifra.com>
parents:
10874
diff
changeset
|
26 use 'hg resolve' to retry unresolved file merges |
12316
4134686b83e1
tests: add exit codes to unified tests
Matt Mackall <mpm@selenic.com>
parents:
12299
diff
changeset
|
27 [1] |
29480
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
28 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
29 Test update when local untracked directory exists with the same name as a |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
30 tracked file in a commit we are updating to |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
31 $ hg init r2 && cd r2 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
32 $ echo root > root && hg ci -Am root # rev 0 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
33 adding root |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
34 $ echo text > name && hg ci -Am "name is a file" # rev 1 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
35 adding name |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
36 $ hg up 0 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
37 0 files updated, 0 files merged, 1 files removed, 0 files unresolved |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
38 $ mkdir name |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
39 $ hg up 1 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
40 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
41 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
42 Test update when local untracked directory exists with some files in it and has |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
43 the same name a tracked file in a commit we are updating to. In future this |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
44 should be updated to give an friendlier error message, but now we should just |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
45 make sure that this does not erase untracked data |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
46 $ hg up 0 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
47 0 files updated, 0 files merged, 1 files removed, 0 files unresolved |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
48 $ mkdir name |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
49 $ echo text > name/file |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
50 $ hg st |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
51 ? name/file |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
52 $ hg up 1 |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
53 abort: *: '$TESTTMP/r1/r2/name' (glob) |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
54 [255] |
1e4512eac59e
update: teach hg to override untracked dir with a tracked file on update
Kostia Balytskyi <ikostia@fb.com>
parents:
26614
diff
changeset
|
55 $ cd .. |
29629
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
56 |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
57 #if symlink |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
58 |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
59 Test update when two commits have symlinks that point to different folders |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
60 $ hg init r3 && cd r3 |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
61 $ echo root > root && hg ci -Am root |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
62 adding root |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
63 $ mkdir folder1 && mkdir folder2 |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
64 $ ln -s folder1 folder |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
65 $ hg ci -Am "symlink to folder1" |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
66 adding folder |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
67 $ rm folder |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
68 $ ln -s folder2 folder |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
69 $ hg ci -Am "symlink to folder2" |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
70 $ hg up 1 |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
71 1 files updated, 0 files merged, 0 files removed, 0 files unresolved |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
72 $ cd .. |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
73 |
b33c0c38d68f
update: fix bug when update tries to modify folder symlink
Kostia Balytskyi <ikostia@fb.com>
parents:
29480
diff
changeset
|
74 #endif |