[Request] [+ ] D8528: dirstate: make sure the dirstate is loaded before the changelog (issue6303)
marmoute (Pierre-Yves David)
phabricator at mercurial-scm.org
Fri May 15 10:23:19 UTC 2020
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
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.
To: marmoute, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mercurial-scm.org/pipermail/mercurial-patches/attachments/20200515/9b8cbb2e/attachment-0001.html>
More information about the Mercurial-patches
mailing list