[PATCH 4 of 5] manifest: use property instead of field for manifest revlog storage
FUJIWARA Katsunori
foozy at lares.dti.ne.jp
Wed Aug 10 04:01:44 EDT 2016
At Mon, 8 Aug 2016 18:17:13 -0700,
Durham Goode wrote:
>
> # HG changeset patch
> # User Durham Goode <durham at fb.com>
> # Date 1470697899 25200
> # Mon Aug 08 16:11:39 2016 -0700
> # Node ID 6a4c09571793d56c8dad1a6760e3fc1293b9a0b6
> # Parent f73abdf84e8e2eb9e2029cb28e2246a55b2d2f49
> manifest: use property instead of field for manifest revlog storage
>
> The file caches we're using to avoid reloading the manifest from disk everytime
> has an annoying bug that causes the in memory structure to not be reloaded if
> the mtime and the size haven't changed. This causes a breakage in the tests
> because the manifestlog is not being reloaded after a commit+strip operation in
> mq (the mtime is the same because it all happens in the same second, and the
> resulting size is the same because we add 1 and remove 1). The only reason this
> doesn't affect the manifest itself is because we touch it so often that we
> had already reloaded it after the commit, but before the strip.
All of main tasks of ExactCacheValidationPlan were included into main
repository before release of 3.9.
https://www.mercurial-scm.org/wiki/ExactCacheValidationPlan
Therefore, change of file should be detected at validation of file
cache, even if writing changed file out (without extra handling in
this plan) causes same ctime/mtime/size/i-node and so on.
Would you tell me the case to reproduce the issue around caching
manifest, if it still occurs on recent Mercurial ? It helps to find
out code paths overlooked by ExactCacheValidationPlan.
> Once the entire manifest has migrated to manifestlog, we can get rid of these
> properties, since then the manifestlog will be touched after the commit, but
> before the strip, as well.
>
> diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
> --- a/mercurial/localrepo.py
> +++ b/mercurial/localrepo.py
> @@ -504,9 +504,9 @@ class localrepository(object):
> def manifest(self):
> return manifest.manifest(self.svfs)
>
> - @storecache('00manifest.i')
> + @property
> def manifestlog(self):
> - return manifest.manifestlog(self.svfs, self.manifest)
> + return manifest.manifestlog(self.svfs, self)
>
> @repofilecache('dirstate')
> def dirstate(self):
> diff --git a/mercurial/manifest.py b/mercurial/manifest.py
> --- a/mercurial/manifest.py
> +++ b/mercurial/manifest.py
> @@ -921,17 +921,23 @@ class manifestlog(object):
> of the list of files in the given commit. Consumers of the output of this
> class do not care about the implementation details of the actual manifests
> they receive (i.e. tree or flat or lazily loaded, etc)."""
> - def __init__(self, opener, oldmanifest):
> - self._revlog = oldmanifest
> + def __init__(self, opener, repo):
> + self._repo = repo
>
> # We'll separate this into it's own cache once oldmanifest is no longer
> # used
> - self._mancache = oldmanifest._mancache
> + self._mancache = repo.manifest._mancache
>
> + @property
> + def _revlog(self):
> + return self._repo.manifest
> +
> + @property
> + def _oldmanifest(self):
> # _revlog is the same as _oldmanifest right now, but we eventually want
> # to delete _oldmanifest while still allowing manifestlog to access the
> # revlog specific apis.
> - self._oldmanifest = oldmanifest
> + return self._repo.manifest
>
> def __getitem__(self, node):
> """Retrieves the manifest instance for the given node. Throws a KeyError
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at mercurial-scm.org
> https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
----------------------------------------------------------------------
[FUJIWARA Katsunori] foozy at lares.dti.ne.jp
More information about the Mercurial-devel
mailing list