equal
deleted
inserted
replaced
1 ===================================================================== |
1 ===================================================================== |
2 Check potential race conditions between a status and other operations |
2 Check potential race conditions between a status and other operations |
3 ===================================================================== |
3 ===================================================================== |
4 |
4 |
5 #testcases dirstate-v1 dirstate-v2 |
5 #testcases dirstate-v1 dirstate-v2-append dirstate-v2-rewrite |
6 |
6 |
7 The `hg status` command can run without the wlock, however it might end up |
7 The `hg status` command can run without the wlock, however it might end up |
8 having to update the on-disk dirstate files, for example to mark ambiguous |
8 having to update the on-disk dirstate files, for example to mark ambiguous |
9 files as clean, or to update directory caches information with dirstate-v2. |
9 files as clean, or to update directory caches information with dirstate-v2. |
10 |
10 |
28 $ cat >> $HGRCPATH << EOF |
28 $ cat >> $HGRCPATH << EOF |
29 > [storage] |
29 > [storage] |
30 > dirstate-v2.slow-path=allow |
30 > dirstate-v2.slow-path=allow |
31 > EOF |
31 > EOF |
32 |
32 |
33 #if dirstate-v2 |
33 #if no-dirstate-v1 |
34 $ cat >> $HGRCPATH << EOF |
34 $ cat >> $HGRCPATH << EOF |
35 > [format] |
35 > [format] |
36 > use-dirstate-v2=yes |
36 > use-dirstate-v2=yes |
37 > EOF |
37 > EOF |
38 #else |
38 #else |
39 $ cat >> $HGRCPATH << EOF |
39 $ cat >> $HGRCPATH << EOF |
40 > [format] |
40 > [format] |
41 > use-dirstate-v2=no |
41 > use-dirstate-v2=no |
42 > EOF |
42 > EOF |
|
43 #endif |
|
44 |
|
45 #if dirstate-v2-rewrite |
|
46 $ d2args="--config devel.dirstate.v2.data_update_mode=force-new" |
|
47 #endif |
|
48 #if dirstate-v2-append |
|
49 $ d2args="--config devel.dirstate.v2.data_update_mode=force-append" |
43 #endif |
50 #endif |
44 |
51 |
45 $ directories="dir dir/nested dir2" |
52 $ directories="dir dir/nested dir2" |
46 $ first_files="dir/nested/a dir/b dir/c dir/d dir2/e f" |
53 $ first_files="dir/nested/a dir/b dir/c dir/d dir2/e f" |
47 $ second_files="g dir/nested/h dir/i dir/j dir2/k dir2/l dir/nested/m" |
54 $ second_files="g dir/nested/h dir/i dir/j dir2/k dir2/l dir/nested/m" |
226 > & |
233 > & |
227 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
234 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
228 |
235 |
229 Add a file |
236 Add a file |
230 |
237 |
231 $ hg add dir/n |
238 $ hg $d2args add dir/n |
232 $ touch $TESTTMP/status-race-lock |
239 $ touch $TESTTMP/status-race-lock |
233 $ wait |
240 $ wait |
234 |
241 |
235 The file should in a "added" state |
242 The file should in a "added" state |
236 |
243 |
237 $ hg status |
244 $ hg status |
238 A dir/n (no-rhg !) |
245 A dir/n (no-rhg !) |
239 A dir/n (rhg no-dirstate-v1 !) |
246 A dir/n (rhg dirstate-v2-rewrite !) |
240 A dir/n (missing-correct-output rhg dirstate-v1 !) |
247 A dir/n (missing-correct-output rhg dirstate-v1 !) |
241 A dir/o |
248 A dir/o |
242 R dir/nested/m |
249 R dir/nested/m |
243 ? dir/n (known-bad-output rhg dirstate-v1 !) |
250 ? dir/n (known-bad-output rhg no-dirstate-v2-rewrite !) |
244 ? p |
251 ? p |
245 ? q |
252 ? q |
246 |
253 |
247 The status process should return a consistent result and not crash. |
254 The status process should return a consistent result and not crash. |
248 |
255 |
251 R dir/nested/m |
258 R dir/nested/m |
252 ? dir/n |
259 ? dir/n |
253 ? p |
260 ? p |
254 ? q |
261 ? q |
255 $ cat $TESTTMP/status-race-lock.log |
262 $ cat $TESTTMP/status-race-lock.log |
256 abort: when writing $TESTTMP/race-with-add/.hg/dirstate.*: $ENOENT$ (glob) (known-bad-output rhg dirstate-v2 !) |
263 abort: when writing $TESTTMP/race-with-add/.hg/dirstate.*: $ENOENT$ (glob) (known-bad-output rhg dirstate-v2-rewrite !) |
257 |
264 |
258 final cleanup |
265 final cleanup |
259 |
266 |
260 $ rm $TESTTMP/status-race-lock $TESTTMP/status-race-lock.waiting |
267 $ rm $TESTTMP/status-race-lock $TESTTMP/status-race-lock.waiting |
261 $ cd .. |
268 $ cd .. |
275 > & |
282 > & |
276 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
283 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
277 |
284 |
278 Add a file and force the data file rewrite |
285 Add a file and force the data file rewrite |
279 |
286 |
280 $ hg commit -m created-during-status dir/o |
287 $ hg $d2args commit -m created-during-status dir/o |
281 $ touch $TESTTMP/status-race-lock |
288 $ touch $TESTTMP/status-race-lock |
282 $ wait |
289 $ wait |
283 |
290 |
284 The parent must change and the status should be clean |
291 The parent must change and the status should be clean |
285 |
292 |
320 R dir/nested/m |
327 R dir/nested/m |
321 ? dir/n |
328 ? dir/n |
322 ? p |
329 ? p |
323 ? q |
330 ? q |
324 $ cat $TESTTMP/status-race-lock.log |
331 $ cat $TESTTMP/status-race-lock.log |
325 abort: when removing $TESTTMP/race-with-commit/.hg/dirstate.*: $ENOENT$ (glob) (known-bad-output rhg dirstate-v2 !) |
332 abort: when removing $TESTTMP/race-with-commit/.hg/dirstate.*: $ENOENT$ (glob) (known-bad-output rhg dirstate-v2-rewrite !) |
326 |
333 |
327 final cleanup |
334 final cleanup |
328 |
335 |
329 $ rm $TESTTMP/status-race-lock $TESTTMP/status-race-lock.waiting |
336 $ rm $TESTTMP/status-race-lock $TESTTMP/status-race-lock.waiting |
330 $ cd .. |
337 $ cd .. |
344 > & |
351 > & |
345 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
352 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
346 |
353 |
347 Add a file and force the data file rewrite |
354 Add a file and force the data file rewrite |
348 |
355 |
349 $ hg update ".~1" |
356 $ hg $d2args update ".~1" |
350 0 files updated, 0 files merged, 6 files removed, 0 files unresolved |
357 0 files updated, 0 files merged, 6 files removed, 0 files unresolved |
351 $ touch $TESTTMP/status-race-lock |
358 $ touch $TESTTMP/status-race-lock |
352 $ wait |
359 $ wait |
353 |
360 |
354 The parent must change and the status should be clean |
361 The parent must change and the status should be clean |
398 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
405 $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting |
399 |
406 |
400 touch g |
407 touch g |
401 |
408 |
402 $ touch -t 200001010025 g |
409 $ touch -t 200001010025 g |
403 $ hg status |
410 $ hg $d2args status |
404 A dir/o |
411 A dir/o |
405 R dir/nested/m |
412 R dir/nested/m |
406 ? dir/n |
413 ? dir/n |
407 ? p |
414 ? p |
408 ? q |
415 ? q |
423 R dir/nested/m |
430 R dir/nested/m |
424 ? dir/n |
431 ? dir/n |
425 ? p |
432 ? p |
426 ? q |
433 ? q |
427 $ cat $TESTTMP/status-race-lock.log |
434 $ cat $TESTTMP/status-race-lock.log |
428 abort: when removing $TESTTMP/race-with-status/.hg/dirstate.*: $ENOENT$ (glob) (known-bad-output rhg dirstate-v2 !) |
435 abort: when removing $TESTTMP/race-with-status/.hg/dirstate.*: $ENOENT$ (glob) (known-bad-output rhg dirstate-v2-rewrite !) |
429 |
436 |
430 final cleanup |
437 final cleanup |
431 |
438 |
432 $ rm $TESTTMP/status-race-lock $TESTTMP/status-race-lock.waiting |
439 $ rm $TESTTMP/status-race-lock $TESTTMP/status-race-lock.waiting |
433 $ cd .. |
440 $ cd .. |