# HG changeset patch # User Pierre-Yves David # Date 1677464070 -3600 # Node ID 3859774322273289c356953036a2ab729ba6039e # Parent 2be6d5782728efaa29cbfc1178a23e1a30e4dc01 dirstate: add append/new-file variants in the dirstate's read race tests This covers more ground and finds more bugs. At that point I gave up on making things as `known-bad-output` / `missing-correct-output` as this gets too messy. diff -r 2be6d5782728 -r 385977432227 tests/test-dirstate-read-race.t --- a/tests/test-dirstate-read-race.t Tue Dec 13 14:51:36 2022 +0100 +++ b/tests/test-dirstate-read-race.t Mon Feb 27 03:14:30 2023 +0100 @@ -3,6 +3,7 @@ ============================================================================== #testcases dirstate-v1 dirstate-v2-append dirstate-v2-rewrite +#testcases pre-all-read pre-some-read Some commands, like `hg status`, do not need to take the wlock but need to access dirstate data. @@ -46,6 +47,17 @@ $ d2args="--config devel.dirstate.v2.data_update_mode=force-append" #endif + +#if dirstate-v1 + $ cfg="devel.sync.dirstate.pre-read-file" +#else +#if pre-all-read + $ cfg="devel.sync.dirstate.pre-read-file" +#else + $ cfg="devel.sync.dirstate.post-docket-read-file" +#endif +#endif + $ directories="dir dir/nested dir2" $ first_files="dir/nested/a dir/b dir/c dir/d dir2/e f" $ second_files="g dir/nested/h dir/i dir/j dir2/k dir2/l dir/nested/m" @@ -134,7 +146,7 @@ $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \ > --config rhg.on-unsupported=abort \ - > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \ + > --config ${cfg}=$TESTTMP/status-race-lock \ > & $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting @@ -165,6 +177,7 @@ $ cat $TESTTMP/status-race-lock.log #else #if rhg +#if pre-all-read $ cat $TESTTMP/status-race-lock.out A dir/n A dir/o @@ -173,12 +186,34 @@ ? q $ cat $TESTTMP/status-race-lock.log #else +#if dirstate-v2-append + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log +#else + $ cat $TESTTMP/status-race-lock.out + $ cat $TESTTMP/status-race-lock.log + abort: dirstate-v2 parse error: not enough bytes on disk +#endif +#endif +#else #if rust #if dirstate-v2-rewrite $ cat $TESTTMP/status-race-lock.out $ cat $TESTTMP/status-race-lock.log abort: $ENOENT$: '$TESTTMP/race-with-add/.hg/dirstate.* (glob) #else + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log #endif #else $ cat $TESTTMP/status-race-lock.out @@ -203,7 +238,7 @@ $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \ > --config rhg.on-unsupported=abort \ - > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \ + > --config ${cfg}=$TESTTMP/status-race-lock \ > & $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting @@ -245,18 +280,41 @@ warning: ignoring unknown working parent 02a67a77ee9b! (no-rhg !) #else #if rhg +#if pre-all-read $ cat $TESTTMP/status-race-lock.out ? dir/n ? p ? q $ cat $TESTTMP/status-race-lock.log #else +#if dirstate-v2-append + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log +#else + $ cat $TESTTMP/status-race-lock.out + $ cat $TESTTMP/status-race-lock.log + abort: dirstate-v2 parse error: not enough bytes on disk +#endif +#endif +#else #if rust #if dirstate-v2-rewrite $ cat $TESTTMP/status-race-lock.out $ cat $TESTTMP/status-race-lock.log abort: $ENOENT$: '$TESTTMP/race-with-commit/.hg/dirstate.* (glob) #else + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log #endif #else $ cat $TESTTMP/status-race-lock.out @@ -281,7 +339,7 @@ $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \ > --config rhg.on-unsupported=abort \ - > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \ + > --config ${cfg}=$TESTTMP/status-race-lock \ > & $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting do an update @@ -301,6 +359,25 @@ 0 files updated, 0 files merged, 6 files removed, 0 files unresolved $ touch $TESTTMP/status-race-lock $ wait +#if rhg dirstate-v2-append pre-some-read + $ hg log -GT '{node|short} {desc}\n' + @ 9a86dcbfb938 more files to have two commit + | + o 4f23db756b09 recreate a bunch of files to facilitate dirstate-v2 append + + $ hg status + A dir/o + R dir/nested/m + ! dir/i + ! dir/j + ! dir/nested/h + ! dir2/k + ! dir2/l + ! g + ? dir/n + ? p + ? q +#else $ hg log -GT '{node|short} {desc}\n' o 9a86dcbfb938 more files to have two commit | @@ -311,6 +388,7 @@ ? dir/n ? p ? q +#endif The status process should return a consistent result and not crash. @@ -323,6 +401,7 @@ $ cat $TESTTMP/status-race-lock.log #else #if rhg +#if pre-all-read $ cat $TESTTMP/status-race-lock.out A dir/o ? dir/n @@ -330,12 +409,46 @@ ? q $ cat $TESTTMP/status-race-lock.log #else +#if dirstate-v2-append + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ! dir/i + ! dir/j + ! dir/nested/h + ! dir2/k + ! dir2/l + ! g + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log +#else + $ cat $TESTTMP/status-race-lock.out + $ cat $TESTTMP/status-race-lock.log + abort: dirstate-v2 parse error: not enough bytes on disk +#endif +#endif +#else #if rust #if dirstate-v2-rewrite $ cat $TESTTMP/status-race-lock.out $ cat $TESTTMP/status-race-lock.log abort: $ENOENT$: '$TESTTMP/race-with-update/.hg/dirstate.* (glob) #else + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ! dir/i + ! dir/j + ! dir/nested/h + ! dir2/k + ! dir2/l + ! g + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log #endif #else $ cat $TESTTMP/status-race-lock.out @@ -362,7 +475,7 @@ $ hg st >$TESTTMP/status-race-lock.out 2>$TESTTMP/status-race-lock.log \ > --config rhg.on-unsupported=abort \ - > --config devel.sync.dirstate.pre-read-file=$TESTTMP/status-race-lock \ + > --config ${cfg}=$TESTTMP/status-race-lock \ > & $ $RUNTESTDIR/testlib/wait-on-file 5 $TESTTMP/status-race-lock.waiting do an update @@ -389,6 +502,16 @@ $ cat $TESTTMP/status-race-lock.log #else #if rhg +#if pre-all-read + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log +#else +#if dirstate-v2-append $ cat $TESTTMP/status-race-lock.out A dir/o R dir/nested/m @@ -397,12 +520,25 @@ ? q $ cat $TESTTMP/status-race-lock.log #else + $ cat $TESTTMP/status-race-lock.out + $ cat $TESTTMP/status-race-lock.log + abort: dirstate-v2 parse error: not enough bytes on disk +#endif +#endif +#else #if rust #if dirstate-v2-rewrite $ cat $TESTTMP/status-race-lock.out $ cat $TESTTMP/status-race-lock.log abort: $ENOENT$: '$TESTTMP/race-with-status/.hg/dirstate.* (glob) #else + $ cat $TESTTMP/status-race-lock.out + A dir/o + R dir/nested/m + ? dir/n + ? p + ? q + $ cat $TESTTMP/status-race-lock.log #endif #else $ cat $TESTTMP/status-race-lock.out