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.
--- 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