tests/test-dirstate-status-write-race.t
branchstable
changeset 49681 3f34d800cc69
parent 49680 ecd28d89c29e
child 49682 e30b9e43be7e
equal deleted inserted replaced
49680:ecd28d89c29e 49681:3f34d800cc69
     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 ..