annotate tests/test-encode.t @ 46607:e9901d01d135

revlog: add a mechanism to verify expected file position before appending If someone uses `hg debuglocks`, or some non-hg process writes to the .hg directory without respecting the locks, or if the repo's on a networked filesystem, it's possible for the revlog code to write out corrupted data. The form of this corruption can vary depending on what data was written and how that happened. We are in the "networked filesystem" case (though I've had users also do this to themselves with the "`hg debuglocks`" scenario), and most often see this with the changelog. What ends up happening is we produce two items (let's call them rev1 and rev2) in the .i file that have the same linkrev, baserev, and offset into the .d file, while the data in the .d file is appended properly. rev2's compressed_size is accurate for rev2, but when we go to decompress the data in the .d file, we use the offset that's recorded in the index file, which is the same as rev1, and attempt to decompress rev2.compressed_size bytes of rev1's data. This usually does not succeed. :) When using inline data, this also fails, though I haven't investigated why too closely. This shows up as a "patch decode" error. I believe what's happening there is that we're basically ignoring the offset field, getting the data properly, but since baserev != rev, it thinks this is a delta based on rev (instead of a full text) and can't actually apply it as such. For now, I'm going to make this an optional component and default it to entirely off. I may increase the default severity of this in the future, once I've enabled it for my users and we gain more experience with it. Luckily, most of my users have a versioned filesystem and can roll back to before the corruption has been written, it's just a hassle to do so and not everyone knows how (so it's a support burden). Users on other filesystems will not have that luxury, and this can cause them to have a corrupted repository that they are unlikely to know how to resolve, and they'll see this as a data-loss event. Refusing to create the corruption is a much better user experience. This mechanism is not perfect. There may be false-negatives (racy writes that are not detected). There should not be any false-positives (non-racy writes that are detected as such). This is not a mechanism that makes putting a repo on a networked filesystem "safe" or "supported", just *less* likely to cause corruption. Differential Revision: https://phab.mercurial-scm.org/D9952
author Kyle Lippincott <spectral@google.com>
date Wed, 03 Feb 2021 16:33:10 -0800
parents 538353b80676
children b7fde9237c92
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
1 Test encode/decode filters
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents:
diff changeset
2
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
3 $ hg init
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
4 $ cat > .hg/hgrc <<EOF
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
5 > [encode]
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
6 > not.gz = tr [:lower:] [:upper:]
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
7 > *.gz = gzip -d
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
8 > [decode]
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
9 > not.gz = tr [:upper:] [:lower:]
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
10 > *.gz = gzip
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
11 > EOF
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
12 $ echo "this is a test" | gzip > a.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
13 $ echo "this is a test" > not.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
14 $ hg add *
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
15 $ hg ci -m "test"
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents:
diff changeset
16
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
17 no changes
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
18
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
19 $ hg status
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
20 $ touch *
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
21
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
22 no changes
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
23
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
24 $ hg status
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
25
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
26 check contents in repo are encoded
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents:
diff changeset
27
14182
ec5886db9dc6 tests: fix deprecated use of hg debugdata/debugindex
Sune Foldager <cryo@cyanite.org>
parents: 12416
diff changeset
28 $ hg debugdata a.gz 0
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
29 this is a test
14182
ec5886db9dc6 tests: fix deprecated use of hg debugdata/debugindex
Sune Foldager <cryo@cyanite.org>
parents: 12416
diff changeset
30 $ hg debugdata not.gz 0
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
31 THIS IS A TEST
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
32
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
33 check committed content was decoded
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents:
diff changeset
34
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
35 $ gunzip < a.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
36 this is a test
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
37 $ cat not.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
38 this is a test
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
39 $ rm *
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
40 $ hg co -C
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
41 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents:
diff changeset
42
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
43 check decoding of our new working dir copy
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents:
diff changeset
44
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
45 $ gunzip < a.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
46 this is a test
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
47 $ cat not.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
48 this is a test
1258
1945754e466b Add file encoding/decoding support
mpm@selenic.com
parents:
diff changeset
49
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
50 check hg cat operation
6093
f5b00b6e426a Option --decode for hg cat to apply decode filters.
Jesse Glick <jesse.glick@sun.com>
parents: 3853
diff changeset
51
12416
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
52 $ hg cat a.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
53 this is a test
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
54 $ hg cat --decode a.gz | gunzip
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
55 this is a test
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
56 $ mkdir subdir
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
57 $ cd subdir
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
58 $ hg -R .. cat ../a.gz
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
59 this is a test
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
60 $ hg -R .. cat --decode ../a.gz | gunzip
1fcdd9b7f657 tests: unify test-encode
Matt Mackall <mpm@selenic.com>
parents: 12156
diff changeset
61 this is a test
37461
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
62 $ cd ..
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
63
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
64 check tempfile filter
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
65
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
66 $ hg cat a.gz --decode --config 'decode.*.gz=tempfile:gzip -c INFILE > OUTFILE' | gunzip
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
67 this is a test
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
68 $ hg cat a.gz --decode --config 'decode.*.gz=tempfile:sh -c "exit 1"'
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
69 abort: command '*' failed: exited with status 1 (glob)
538353b80676 procutil: fix error message of tempfile filter
Yuya Nishihara <yuya@tcha.org>
parents: 16913
diff changeset
70 [255]
16913
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 14182
diff changeset
71
f2719b387380 tests: add missing trailing 'cd ..'
Mads Kiilerich <mads@kiilerich.com>
parents: 14182
diff changeset
72 $ cd ..