annotate tests/test-oldcgi.t @ 30779:38aa1ca97b6a

repair: migrate revlogs during upgrade Our next step for in-place upgrade is to migrate store data. Revlogs are the biggest source of data within the store and a store is useless without them, so we implement their migration first. Our strategy for migrating revlogs is to walk the store and call `revlog.clone()` on each revlog. There are some minor complications. Because revlogs have different storage options (e.g. changelog has generaldelta and delta chains disabled), we need to obtain the correct class of revlog so inserted data is encoded properly for its type. Various attempts at implementing progress indicators that didn't lead to frustration from false "it's almost done" indicators were made. I initially used a single progress bar based on number of revlogs. However, this quickly churned through all filelogs, got to 99% then effectively froze at 99.99% when it got to the manifest. So I converted the progress bar to total revision count. This was a little bit better. But the manifest was still significantly slower than filelogs and it took forever to process the last few percent. I then tried both revision/chunk bytes and raw bytes as the denominator. This had the opposite effect: because so much data is in manifests, it would churn through filelogs without showing much progress. When it got to manifests, it would fill in 90+% of the progress bar. I finally gave up having a unified progress bar and instead implemented 3 progress bars: 1 for filelog revisions, 1 for manifest revisions, and 1 for changelog revisions. I added extra messages indicating the total number of revisions of each so users know there are more progress bars coming. I also added extra messages before and after each stage to give extra details about what is happening. Strictly speaking, this isn't necessary. But the numbers are impressive. For example, when converting a non-generaldelta mozilla-central repository, the messages you see are: migrating 2475593 total revisions (1833043 in filelogs, 321156 in manifests, 321394 in changelog) migrating 1.67 GB in store; 2508 GB tracked data migrating 267868 filelogs containing 1833043 revisions (1.09 GB in store; 57.3 GB tracked data) finished migrating 1833043 filelog revisions across 267868 filelogs; change in size: -415776 bytes migrating 1 manifests containing 321156 revisions (518 MB in store; 2451 GB tracked data) That "2508 GB" figure really blew me away. I had no clue that the raw tracked data in mozilla-central was that large. Granted, 2451 GB is in the manifest and "only" 57.3 GB is in filelogs. But still. It's worth noting that gratuitous loading of source revlogs in order to display numbers and progress bars does serve a purpose: it ensures we can open all source revlogs. We don't want to spend several minutes copying revlogs only to encounter a permissions error or similar later. As part of this commit, we also add swapping of the store directory to the upgrade function. After revlogs are converted, we move the old store into the backup directory then move the temporary repo's store into the old store's location. On well-behaved systems, this should be 2 atomic operations and the window of inconsistency show be very narrow. There are still a few improvements to be made to store copying and upgrading. But this commit gets the bulk of the work out of the way.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sun, 18 Dec 2016 17:00:15 -0800
parents 7a9cbb315d84
children b6776b34e44e
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
22046
7a9cbb315d84 tests: replace exit 80 with #require
Matt Mackall <mpm@selenic.com>
parents: 15567
diff changeset
1 #require no-msys # MSYS will translate web paths as if they were file paths
15567
8b84d040d9f9 tests: introduce 'hghave msys' to skip tests that would fail because of msys
Mads Kiilerich <mads@kiilerich.com>
parents: 13269
diff changeset
2
12472
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
3 This tests if CGI files from before d0db3462d568 still work.
2533
589474a1dc36 Create a test to make sure old CGI scripts will still work.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
4
12472
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
5 $ hg init test
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
6 $ cat >hgweb.cgi <<HGWEB
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
7 > #!/usr/bin/env python
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
8 > #
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
9 > # An example CGI script to use hgweb, edit as necessary
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
10 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
11 > import cgitb, os, sys
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
12 > cgitb.enable()
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
13 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
14 > # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
15 > from mercurial import hgweb
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
16 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
17 > h = hgweb.hgweb("test", "Empty test repository")
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
18 > h.run()
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
19 > HGWEB
2533
589474a1dc36 Create a test to make sure old CGI scripts will still work.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
20
12472
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
21 $ chmod 755 hgweb.cgi
2533
589474a1dc36 Create a test to make sure old CGI scripts will still work.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
22
12472
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
23 $ cat >hgweb.config <<HGWEBDIRCONF
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
24 > [paths]
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
25 > test = test
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
26 > HGWEBDIRCONF
2533
589474a1dc36 Create a test to make sure old CGI scripts will still work.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
27
12472
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
28 $ cat >hgwebdir.cgi <<HGWEBDIR
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
29 > #!/usr/bin/env python
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
30 > #
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
31 > # An example CGI script to export multiple hgweb repos, edit as necessary
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
32 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
33 > import cgitb, sys
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
34 > cgitb.enable()
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
35 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
36 > # sys.path.insert(0, "/path/to/python/lib") # if not a system-wide install
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
37 > from mercurial import hgweb
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
38 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
39 > # The config file looks like this. You can have paths to individual
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
40 > # repos, collections of repos in a directory tree, or both.
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
41 > #
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
42 > # [paths]
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
43 > # virtual/path = /real/path
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
44 > # virtual/path = /real/path
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
45 > #
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
46 > # [collections]
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
47 > # /prefix/to/strip/off = /root/of/tree/full/of/repos
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
48 > #
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
49 > # collections example: say directory tree /foo contains repos /foo/bar,
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
50 > # /foo/quux/baz. Give this config section:
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
51 > # [collections]
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
52 > # /foo = /foo
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
53 > # Then repos will list as bar and quux/baz.
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
54 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
55 > # Alternatively you can pass a list of ('virtual/path', '/real/path') tuples
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
56 > # or use a dictionary with entries like 'virtual/path': '/real/path'
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
57 >
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
58 > h = hgweb.hgwebdir("hgweb.config")
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
59 > h.run()
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
60 > HGWEBDIR
2533
589474a1dc36 Create a test to make sure old CGI scripts will still work.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
61
12472
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
62 $ chmod 755 hgwebdir.cgi
2533
589474a1dc36 Create a test to make sure old CGI scripts will still work.
Eric Hopper <hopper@omnifarious.org>
parents:
diff changeset
63
13269
aa3f726a2bdb tests: remove duplication of the CGI environment variables
StevenGBrown
parents: 12472
diff changeset
64 $ . "$TESTDIR/cgienv"
12472
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
65 $ python hgweb.cgi > page1
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
66 $ python hgwebdir.cgi > page2
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
67
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
68 $ PATH_INFO="/test/"
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
69 $ PATH_TRANSLATED="/var/something/test.cgi"
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
70 $ REQUEST_URI="/test/test/"
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
71 $ SCRIPT_URI="http://hg.omnifarious.org/test/test/"
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
72 $ SCRIPT_URL="/test/test/"
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
73 $ python hgwebdir.cgi > page3
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
74
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
75 $ grep -i error page1 page2 page3
17c62039cadd tests: unify test-oldcgi
Matt Mackall <mpm@selenic.com>
parents: 5580
diff changeset
76 [1]