##// END OF EJS Templates
tests: sort some imports that were previously missed...
Augie Fackler -
r42581:055687fe default
parent child Browse files
Show More
@@ -1,238 +1,238 b''
1 1 ================================
2 2 Test corner case around bookmark
3 3 ================================
4 4
5 5 This test file is meant to gather test around bookmark that are specific
6 6 enough to not find a place elsewhere.
7 7
8 8 Test bookmark/changelog race condition
9 9 ======================================
10 10
11 11 The data from the bookmark file are filtered to only contains bookmark with
12 12 node known to the changelog. If the cache invalidation between these two bits
13 13 goes wrong, bookmark can be dropped.
14 14
15 15 global setup
16 16 ------------
17 17
18 18 $ cat >> $HGRCPATH << EOF
19 19 > [ui]
20 20 > ssh = "$PYTHON" "$TESTDIR/dummyssh"
21 21 > [server]
22 22 > concurrent-push-mode=check-related
23 23 > EOF
24 24
25 25 Setup
26 26 -----
27 27
28 28 initial repository setup
29 29
30 30 $ hg init bookrace-server
31 31 $ cd bookrace-server
32 32 $ echo a > a
33 33 $ hg add a
34 34 $ hg commit -m root
35 35 $ echo a >> a
36 36 $ hg bookmark book-A
37 37 $ hg commit -m A0
38 38 $ hg up 'desc(root)'
39 39 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
40 40 (leaving bookmark book-A)
41 41 $ echo b > b
42 42 $ hg add b
43 43 $ hg bookmark book-B
44 44 $ hg commit -m B0
45 45 created new head
46 46 $ hg up null
47 47 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
48 48 (leaving bookmark book-B)
49 49 $ hg phase --public --rev 'all()'
50 50 $ hg log -G
51 51 o changeset: 2:c79985706978
52 52 | bookmark: book-B
53 53 | tag: tip
54 54 | parent: 0:6569b5a81c7e
55 55 | user: test
56 56 | date: Thu Jan 01 00:00:00 1970 +0000
57 57 | summary: B0
58 58 |
59 59 | o changeset: 1:39c28d785860
60 60 |/ bookmark: book-A
61 61 | user: test
62 62 | date: Thu Jan 01 00:00:00 1970 +0000
63 63 | summary: A0
64 64 |
65 65 o changeset: 0:6569b5a81c7e
66 66 user: test
67 67 date: Thu Jan 01 00:00:00 1970 +0000
68 68 summary: root
69 69
70 70 $ hg book
71 71 book-A 1:39c28d785860
72 72 book-B 2:c79985706978
73 73 $ cd ..
74 74
75 75 Add new changeset on each bookmark in distinct clones
76 76
77 77 $ hg clone ssh://user@dummy/bookrace-server client-A
78 78 requesting all changes
79 79 adding changesets
80 80 adding manifests
81 81 adding file changes
82 82 added 3 changesets with 3 changes to 2 files (+1 heads)
83 83 new changesets 6569b5a81c7e:c79985706978
84 84 updating to branch default
85 85 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
86 86 $ hg -R client-A update book-A
87 87 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
88 88 (activating bookmark book-A)
89 89 $ echo a >> client-A/a
90 90 $ hg -R client-A commit -m A1
91 91 $ hg clone ssh://user@dummy/bookrace-server client-B
92 92 requesting all changes
93 93 adding changesets
94 94 adding manifests
95 95 adding file changes
96 96 added 3 changesets with 3 changes to 2 files (+1 heads)
97 97 new changesets 6569b5a81c7e:c79985706978
98 98 updating to branch default
99 99 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
100 100 $ hg -R client-B update book-B
101 101 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
102 102 (activating bookmark book-B)
103 103 $ echo b >> client-B/b
104 104 $ hg -R client-B commit -m B1
105 105
106 106 extension to reproduce the race
107 107 -------------------------------
108 108
109 109 If two process are pushing we want to make sure the following happens:
110 110
111 111 * process A read changelog
112 112 * process B to its full push
113 113 * process A read bookmarks
114 114 * process A proceed with rest of the push
115 115
116 116 We build a server side extension for this purpose
117 117
118 118 $ cat > bookrace.py << EOF
119 > import atexit
119 120 > import os
120 121 > import time
121 > import atexit
122 > from mercurial import error, extensions, bookmarks
122 > from mercurial import bookmarks, error, extensions
123 123 > def wrapinit(orig, self, repo):
124 124 > if not os.path.exists('push-A-started'):
125 125 > print('setting raced push up')
126 126 > with open('push-A-started', 'w'):
127 127 > pass
128 128 > clock = 300
129 129 > while not os.path.exists('push-B-done'):
130 130 > clock -= 1
131 131 > if clock <= 0:
132 132 > raise error.Abort("race scenario timed out")
133 133 > time.sleep(0.1)
134 134 > return orig(self, repo)
135 135 >
136 136 > repo.__class__ = racedrepo
137 137 > def uisetup(ui):
138 138 > extensions.wrapfunction(bookmarks.bmstore, '__init__', wrapinit)
139 139 > def e():
140 140 > with open('push-A-done', 'w'):
141 141 > pass
142 142 > atexit.register(e)
143 143 > EOF
144 144
145 145 Actual test
146 146 -----------
147 147
148 148 Start the raced push.
149 149
150 150 $ cat >> bookrace-server/.hg/hgrc << EOF
151 151 > [extensions]
152 152 > bookrace=$TESTTMP/bookrace.py
153 153 > EOF
154 154 $ hg push -R client-A -r book-A >push-output.txt 2>&1 &
155 155
156 156 Wait up to 30 seconds for that push to start.
157 157
158 158 $ clock=30
159 159 $ while [ ! -f push-A-started ] && [ $clock -gt 0 ] ; do
160 160 > clock=`expr $clock - 1`
161 161 > sleep 1
162 162 > done
163 163
164 164 Do the other push.
165 165
166 166 $ cat >> bookrace-server/.hg/hgrc << EOF
167 167 > [extensions]
168 168 > bookrace=!
169 169 > EOF
170 170
171 171 $ hg push -R client-B -r book-B
172 172 pushing to ssh://user@dummy/bookrace-server
173 173 searching for changes
174 174 remote: adding changesets
175 175 remote: adding manifests
176 176 remote: adding file changes
177 177 remote: added 1 changesets with 1 changes to 1 files
178 178 updating bookmark book-B
179 179
180 180 Signal the raced put that we are done (it waits up to 30 seconds).
181 181
182 182 $ touch push-B-done
183 183
184 184 Wait for the raced push to finish (with the remaning of the initial 30 seconds).
185 185
186 186 $ while [ ! -f push-A-done ] && [ $clock -gt 0 ] ; do
187 187 > clock=`expr $clock - 1`
188 188 > sleep 1
189 189 > done
190 190
191 191 Check raced push output.
192 192
193 193 $ cat push-output.txt
194 194 pushing to ssh://user@dummy/bookrace-server
195 195 searching for changes
196 196 remote: setting raced push up
197 197 remote: adding changesets
198 198 remote: adding manifests
199 199 remote: adding file changes
200 200 remote: added 1 changesets with 1 changes to 1 files
201 201 updating bookmark book-A
202 202
203 203 Check result of the push.
204 204
205 205 $ hg -R bookrace-server log -G
206 206 o changeset: 4:9ce3b28c16de
207 207 | bookmark: book-A
208 208 | tag: tip
209 209 | parent: 1:39c28d785860
210 210 | user: test
211 211 | date: Thu Jan 01 00:00:00 1970 +0000
212 212 | summary: A1
213 213 |
214 214 | o changeset: 3:f26c3b5167d1
215 215 | | bookmark: book-B
216 216 | | user: test
217 217 | | date: Thu Jan 01 00:00:00 1970 +0000
218 218 | | summary: B1
219 219 | |
220 220 | o changeset: 2:c79985706978
221 221 | | parent: 0:6569b5a81c7e
222 222 | | user: test
223 223 | | date: Thu Jan 01 00:00:00 1970 +0000
224 224 | | summary: B0
225 225 | |
226 226 o | changeset: 1:39c28d785860
227 227 |/ user: test
228 228 | date: Thu Jan 01 00:00:00 1970 +0000
229 229 | summary: A0
230 230 |
231 231 o changeset: 0:6569b5a81c7e
232 232 user: test
233 233 date: Thu Jan 01 00:00:00 1970 +0000
234 234 summary: root
235 235
236 236 $ hg -R bookrace-server book
237 237 book-A 4:9ce3b28c16de
238 238 book-B 3:f26c3b5167d1
General Comments 0
You need to be logged in to leave comments. Login now