annotate tests/test-pending.t @ 17616:9535a0dc41f2

store: implement fncache basic path encoding in C (This is not yet enabled; it will be turned on in a followup patch.) The path encoding performed by fncache is complex and (perhaps surprisingly) slow enough to negatively affect the overall performance of Mercurial. For a short path (< 120 bytes), the Python code can be reduced to a fairly tractable state machine that either determines that nothing needs to be done in a single pass, or performs the encoding in a second pass. For longer paths, we avoid the more complicated hashed encoding scheme for now, and fall back to Python. Raw performance: I measured in a repo containing 150,000 files in its tip manifest, with a median path name length of 57 bytes, and 95th percentile of 96 bytes. In this repo, the Python code takes 3.1 seconds to encode all path names, while the hybrid C-and-Python code (called from Python) takes 0.21 seconds, for a speedup of about 14. Across several other large repositories, I've measured the speedup from the C code at between 26x and 40x. For path names above 120 bytes where we must fall back to Python for hashed encoding, the speedup is about 1.7x. Thus absolute performance will depend strongly on the characteristics of a particular repository.
author Bryan O'Sullivan <bryano@fb.com>
date Tue, 18 Sep 2012 15:42:19 -0700
parents 921458360270
children 8678b1eafbcf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
13237
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
1 Verify that pending changesets are seen by pretxn* hooks but not by other
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
2 processes that access the destination repo while the hooks are running.
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
3
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
4 The hooks (python and external) both reject changesets after some think time,
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
5 during which another process runs pull. Each hook creates a file ('notify') to
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
6 indicate to the controlling process that it is running; the process removes the
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
7 file to indicate the hook can terminate.
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
8
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
9 init env vars
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
10
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
11 $ d=`pwd`
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
12 $ maxwait=20
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
13
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
14 utility to run the test - start a push in the background and run pull
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
15
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
16 $ dotest() {
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
17 > rm -f notify
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
18 > printf 'push '; hg -R child-push tip --template '{node}\n'
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
19 > hg -R child-push -q push > push.out 2>&1 &
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
20 >
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
21 > # wait for hook to create the notify file
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
22 > i=$maxwait
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
23 > while [ ! -f notify -a $i != 0 ]; do
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
24 > sleep 1
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
25 > i=`expr $i - 1`
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
26 > done
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
27 >
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
28 > # run pull
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
29 > hg -R child-pull -q pull
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
30 > rc=$?
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
31 >
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
32 > # tell hook to finish; notify should exist.
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
33 > rm notify
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
34 > wait
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
35 >
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
36 > cat push.out
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
37 > printf 'pull '; hg -R child-pull tip --template '{node}\n'
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
38 > return $rc
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
39 > }
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
40
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
41 python hook
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
42
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
43 $ cat <<EOF > reject.py
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
44 > import os, time
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
45 > from mercurial import ui, localrepo
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
46 > def rejecthook(ui, repo, hooktype, node, **opts):
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
47 > ui.write('hook %s\\n' % repo['tip'].hex())
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
48 > # create the notify file so caller knows we're running
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
49 > fpath = os.path.join('$d', 'notify')
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
50 > f = open(fpath, 'w')
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
51 > f.close()
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
52 > # wait for ack - caller should delete the notify file
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
53 > i = $maxwait
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
54 > while os.path.exists(fpath) and i > 0:
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
55 > time.sleep(1)
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
56 > i -= 1
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
57 > return True # reject the changesets
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
58 > EOF
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
59
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
60 external hook
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
61
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
62 $ cat <<EOF > reject.sh
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
63 > printf 'hook '; hg tip --template '{node}\\n'
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
64 > # create the notify file so caller knows we're running
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
65 > fpath=$d/notify
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
66 > touch \$fpath
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
67 > # wait for ack - caller should delete the notify file
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
68 > i=$maxwait
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
69 > while [ -f \$fpath -a \$i != 0 ]; do
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
70 > sleep 1
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
71 > i=\`expr \$i - 1\`
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
72 > done
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
73 > exit 1 # reject the changesets
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
74 > EOF
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
75
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
76 create repos
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
77
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
78 $ hg init parent
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
79 $ hg clone -q parent child-push
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
80 $ hg clone -q parent child-pull
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
81 $ echo a > child-push/a
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
82 $ hg -R child-push add child-push/a
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
83 $ hg -R child-push commit -m a -d '1000000 0'
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
84
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
85 test python hook
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
86
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
87 $ cat <<EOF > parent/.hg/hgrc
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
88 > [extensions]
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
89 > reject = $d/reject.py
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
90 > [hooks]
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
91 > pretxnchangegroup = python:reject.rejecthook
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
92 > EOF
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
93
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
94 $ dotest
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
95 push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
96 hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
97 transaction abort!
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
98 rollback completed
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
99 abort: pretxnchangegroup hook failed
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
100 pull 0000000000000000000000000000000000000000
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
101
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
102 test external hook
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
103
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
104 $ cat <<EOF > parent/.hg/hgrc
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
105 > [hooks]
16975
921458360270 tests: remove hghave system-sh from test-pending.t
Mads Kiilerich <mads@kiilerich.com>
parents: 16107
diff changeset
106 > pretxnchangegroup = sh $d/reject.sh
13237
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
107 > EOF
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
108
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
109 $ dotest
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
110 push 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
111 hook 29b62aeb769fdf78d8d9c5f28b017f76d7ef824b
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
112 transaction abort!
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
113 rollback completed
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
114 abort: pretxnchangegroup hook exited with status 1
c046978cc0a9 tests: check visibility of pending changesets
John Coomes <john.coomes@oracle.com>
parents:
diff changeset
115 pull 0000000000000000000000000000000000000000