Patchwork D11749: test: add test of a race resulting in bad dirstate

login
register
mail settings
Submitter phabricator
Date Nov. 11, 2021, 1:24 a.m.
Message ID <differential-rev-PHID-DREV-kspebfj4dwii5yhku6s3-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/50074/
State New
Headers show

Comments

phabricator - Nov. 11, 2021, 1:24 a.m.
valentin.gatienbaron created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Specifically, the size stored in the dirstate is wrong.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D11749

AFFECTED FILES
  tests/test-dirstate-race2.t

CHANGE DETAILS




To: valentin.gatienbaron, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-dirstate-race2.t b/tests/test-dirstate-race2.t
--- a/tests/test-dirstate-race2.t
+++ b/tests/test-dirstate-race2.t
@@ -24,17 +24,23 @@ 
   n 644          3 (set  |unset)               a (re)
 
   $ cat >> $TESTTMP/dirstaterace.py << EOF
+  > import time
   > from mercurial import (
+  >     commit,
   >     extensions,
   >     merge,
   > )
   > def extsetup(ui):
-  >     extensions.wrapfunction(merge, 'applyupdates', wrap)
-  > def wrap(orig, *args, **kwargs):
-  >     res = orig(*args, **kwargs)
-  >     with open("a", "w"):
-  >         pass # just truncate the file
-  >     return res
+  >     extensions.wrapfunction(merge, 'applyupdates', wrap(0))
+  >     extensions.wrapfunction(commit, 'commitctx', wrap(1))
+  > def wrap(duration):
+  >     def new(orig, *args, **kwargs):
+  >         res = orig(*args, **kwargs)
+  >         with open("a", "w"):
+  >             pass # just truncate the file
+  >         time.sleep(duration)
+  >         return res
+  >     return new
   > EOF
 
 Do an update where file 'a' is changed between hg writing it to disk
@@ -46,3 +52,28 @@ 
   $ hg debugdirstate --no-dates
   n 644          2 (set  |unset)               a (re)
   $ echo a > a; hg status; hg diff
+
+Do a commit where file 'a' is changed between hg committing its new
+revision into the repository, and the writing of the dirstate. This
+results in a corrupted dirstate (size doesn't match committed size).
+
+  $ echo aaa > a; hg commit -qm _
+  $ hg merge -qr 1; hg resolve -m; rm a.orig
+  warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
+  (no more unresolved files)
+  $ cat a
+  <<<<<<< working copy: be46f74ce38d - test: _
+  aaa
+  =======
+  aa
+  >>>>>>> merge rev:    eb3fc6c17aa3 - test: _
+  $ hg debugdirstate --no-dates
+  m   0         -2 (set  |unset)               a (re)
+  $ hg commit -m _ --config extensions.race=$TESTTMP/dirstaterace.py
+  $ hg debugdirstate --no-dates
+  n 644          0 (set  |unset)               a (re)
+  $ cat a | wc -c
+   *0 (re)
+  $ hg cat -r . a | wc -c
+   *105 (re)
+  $ hg status; hg diff --stat