Patchwork D8528: dirstate: make sure the dirstate is loaded before the changelog (issue6303)

login
register
mail settings
Submitter phabricator
Date May 15, 2020, 10:23 a.m.
Message ID <differential-rev-PHID-DREV-sxqpwiowrpe4nuhdlyze-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46316/
State Superseded
Headers show

Comments

phabricator - May 15, 2020, 10:23 a.m.
marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Before this change, it was possible for the changelog to be loaded before the
  dirstate. If a transaction happens betwen the changelog and dirstate reading,
  the dirstate can up end poitning toward a revision not existing in the (olded)
  changelog. This lead to a warning.
  
  With this revision, we preload the dirstate parent before reading the changelog.
  This has a negligible performance impact on performance for all case we are
  tracking.

REPOSITORY
  rHG Mercurial

BRANCH
  stable

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

AFFECTED FILES
  mercurial/dirstate.py
  mercurial/localrepo.py
  tests/test-static-http.t

CHANGE DETAILS




To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-static-http.t b/tests/test-static-http.t
--- a/tests/test-static-http.t
+++ b/tests/test-static-http.t
@@ -233,6 +233,7 @@ 
   /.hg/cache/hgtagsfnodes1
   /.hg/cache/rbc-names-v1
   /.hg/cache/rbc-revs-v1
+  /.hg/dirstate
   /.hg/requires
   /.hg/store/00changelog.i
   /.hg/store/00manifest.i
@@ -250,6 +251,7 @@ 
   /remote-with-names/.hg/cache/rbc-names-v1
   /remote-with-names/.hg/cache/rbc-revs-v1
   /remote-with-names/.hg/cache/tags2-served
+  /remote-with-names/.hg/dirstate
   /remote-with-names/.hg/localtags
   /remote-with-names/.hg/requires
   /remote-with-names/.hg/store/00changelog.i
@@ -266,6 +268,7 @@ 
   /remote/.hg/cache/rbc-names-v1
   /remote/.hg/cache/rbc-revs-v1
   /remote/.hg/cache/tags2-served
+  /remote/.hg/dirstate
   /remote/.hg/localtags
   /remote/.hg/requires
   /remote/.hg/store/00changelog.i
@@ -278,6 +281,7 @@ 
   /remote/.hg/store/data/~2ehgtags.i (py37 !)
   /remotempty/.hg/bookmarks
   /remotempty/.hg/bookmarks.current
+  /remotempty/.hg/dirstate
   /remotempty/.hg/requires
   /remotempty/.hg/store/00changelog.i
   /remotempty/.hg/store/00manifest.i
@@ -286,6 +290,7 @@ 
   /sub/.hg/cache/hgtagsfnodes1
   /sub/.hg/cache/rbc-names-v1
   /sub/.hg/cache/rbc-revs-v1
+  /sub/.hg/dirstate
   /sub/.hg/requires
   /sub/.hg/store/00changelog.i
   /sub/.hg/store/00manifest.i
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -1450,6 +1450,8 @@ 
 
     @storecache(b'00changelog.i')
     def changelog(self):
+        # load dirstate before changelog to avoid race see issue6303
+        self.dirstate.prefetch_parents()
         return self.store.changelog(txnutil.mayhavepending(self.root))
 
     @storecache(b'00manifest.i')
diff --git a/mercurial/dirstate.py b/mercurial/dirstate.py
--- a/mercurial/dirstate.py
+++ b/mercurial/dirstate.py
@@ -103,6 +103,13 @@ 
         # raises an exception).
         self._cwd
 
+    def prefetch_parents(self):
+        """make sure the parents are loaded
+
+        Used to avoid a race condition.
+        """
+        self._pl
+
     @contextlib.contextmanager
     def parentchange(self):
         '''Context manager for handling dirstate parents.