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