Mercurial > hg
annotate tests/test-fix-pickle.t @ 49269:395f28064826
worker: avoid potential partial write of pickled data
Previously, the code wrote the pickled data using os.write(). However,
os.write() can write less bytes than passed to it. To trigger the problem, the
pickled data had to be larger than 2147479552 bytes on my system.
Instead, open a file object and pass it to pickle.dump(). This also has the
advantage that it doesn’t buffer the whole pickled data in memory.
Note that the opened file must be buffered because pickle doesn’t support
unbuffered streams because unbuffered streams’ write() method might write less
bytes than passed to it (like os.write()) but pickle.dump() relies on that all
bytes are written (see https://github.com/python/cpython/issues/93050).
The side effect of using a file object and a with statement is that wfd is
explicitly closed now while it seems like before it was implicitly closed by
process exit.
author | Manuel Jacob <me@manueljacob.de> |
---|---|
date | Sun, 22 May 2022 03:50:34 +0200 |
parents | 7d24201b6447 |
children |
rev | line source |
---|---|
45390
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
1 A script that implements uppercasing all letters in a file. |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
2 |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
3 $ UPPERCASEPY="$TESTTMP/uppercase.py" |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
4 $ cat > $UPPERCASEPY <<EOF |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
5 > import sys |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
6 > from mercurial.utils.procutil import setbinary |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
7 > setbinary(sys.stdin) |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
8 > setbinary(sys.stdout) |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
9 > sys.stdout.write(sys.stdin.read().upper()) |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
10 > EOF |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
11 $ TESTLINES="foo\nbar\nbaz\n" |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
12 $ printf $TESTLINES | "$PYTHON" $UPPERCASEPY |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
13 FOO |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
14 BAR |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
15 BAZ |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
16 |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
17 This file attempts to test our workarounds for pickle's lack of |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
18 support for short reads. |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
19 |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
20 $ cat >> $HGRCPATH <<EOF |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
21 > [extensions] |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
22 > fix = |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
23 > [fix] |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
24 > uppercase-whole-file:command="$PYTHON" $UPPERCASEPY |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
25 > uppercase-whole-file:pattern=set:** |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
26 > EOF |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
27 |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
28 $ hg init repo |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
29 $ cd repo |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
30 |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
31 # Create a file that's large enough that it seems to not fit in |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
32 # pickle's buffer, making it use the code path that expects our |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
33 # _blockingreader's read() method to return bytes. |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
34 $ echo "some stuff" > file |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
35 $ for i in $($TESTDIR/seq.py 13); do |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
36 > cat file file > tmp |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
37 > mv -f tmp file |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
38 > done |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
39 $ hg commit -Am "add large file" |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
40 adding file |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
41 |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
42 Check that we don't get a crash |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
43 |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
44 $ hg fix -r . |
7d24201b6447
worker: don't expose readinto() on _blockingreader since pickle is picky
Martin von Zweigbergk <martinvonz@google.com>
parents:
diff
changeset
|
45 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/*-fix.hg (glob) |