[PATCH stable] revisionbranchcache: fall back to slow path if starting readonly (issue4531)

Augie Fackler raf at durin42.com
Tue Feb 10 13:04:57 CST 2015


On Fri, Feb 06, 2015 at 02:53:31AM +0100, Mads Kiilerich wrote:
> # HG changeset patch
> # User Mads Kiilerich <madski at unity3d.com>
> # Date 1423187530 -3600
> #      Fri Feb 06 02:52:10 2015 +0100
> # Branch stable
> # Node ID 83796637ce12f8d0e913f6db062eae5b835dbea9
> # Parent  942a5a34b2d0611ab284380fbe45b9bb1897af98
> revisionbranchcache: fall back to slow path if starting readonly (issue4531)
>
> Transitioning to Mercurial versions with revision branch cache could be slow as
> long as all operations were readonly (revset queries) and the cache would be
> populated but not written back.
>
> Instead, fall back to using the consistently slow path when readonly and the
> cache doesn't exist yet. That avoids the overhead of populating the cache
> without writing it back.
>
> If not readonly, it will still populate all missing entries initially. That
> avoids repeated writing of the cache file with small updates, and it also makes
> sure a fully populated cache available for the readonly operations.
>
> diff --git a/mercurial/branchmap.py b/mercurial/branchmap.py
> --- a/mercurial/branchmap.py
> +++ b/mercurial/branchmap.py
> @@ -330,7 +330,7 @@ class revbranchcache(object):
>      and will grow with it but be 1/8th of its size.
>      """
>
> -    def __init__(self, repo):
> +    def __init__(self, repo, readonly=True):
>          assert repo.filtername is None
>          self._names = [] # branch names in local encoding with static index
>          self._rbcrevs = array('c') # structs of type _rbcrecfmt
> @@ -342,6 +342,10 @@ class revbranchcache(object):
>          except (IOError, OSError), inst:
>              repo.ui.debug("couldn't read revision branch cache names: %s\n" %
>                            inst)
> +            if readonly:
> +                # don't try to use cache - fall back to the slow path
> +                self.branchinfo = self._branchinfo

Do we have any way we can use the cache if it's available (already
loaded), but skip loading/fixing it up if we're on the readonly path
and it's not already loaded?


> +
>          if self._names:
>              try:
>                  data = repo.vfs.read(_rbcrevs)
> diff --git a/mercurial/revset.py b/mercurial/revset.py
> --- a/mercurial/revset.py
> +++ b/mercurial/revset.py
> @@ -527,7 +527,7 @@ def branch(repo, subset, x):
>      import branchmap
>      urepo = repo.unfiltered()
>      ucl = urepo.changelog
> -    getbi = branchmap.revbranchcache(urepo).branchinfo
> +    getbi = branchmap.revbranchcache(urepo, readonly=True).branchinfo
>
>      try:
>          b = getstring(x, '')
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at selenic.com
> http://selenic.com/mailman/listinfo/mercurial-devel


More information about the Mercurial-devel mailing list