[PATCH 3 of 3] repoview: add optional hiddencache verification
Pierre-Yves David
pierre-yves.david at ens-lyon.org
Thu Aug 7 22:47:22 CDT 2014
On 08/07/2014 11:08 AM, David Soria Parra wrote:
> # HG changeset patch
> # User David Soria Parra <davidsp at fb.com>
> # Date 1407430439 25200
> # Thu Aug 07 09:53:59 2014 -0700
> # Node ID 5dd7cb3ba93256f916a970a4dc1f1b7e178e4176
> # Parent 3da6820d38112cddfc21e2b99ab02957f93d80cf
> repoview: add optional hiddencache verification
>
> To ensure our cache approach is correct and users aren't affected, we are
> verifying the cache by default. If we don't encounter any user reports of an
> invalid cache we will remove the verification and the internal variable.
>
> diff --git a/mercurial/repoview.py b/mercurial/repoview.py
> --- a/mercurial/repoview.py
> +++ b/mercurial/repoview.py
> @@ -86,11 +86,19 @@
> if iscachevalid(repo, hideable):
> data = repo.vfs.read(cachefile)
> hidden = frozenset(struct.unpack('%sI' % (len(data) / 4), data))
> + # internal: don't document as it will be removed in the future.
> + if repo.ui.configbool('repoview', 'verifycache', True):
> + blocked = cl.ancestors(_gethiddenblockers(repo), inclusive=True)
> + computed = frozenset(r for r in hideable if r not in blocked)
> + if computed != hidden:
> + invalidatecache(repo)
> + repo.ui.warn(_('Cache inconsistency detected. Please ' +
> + 'open an issue on http://bz.selenic.com.\n'))
> + hidden = computed
> else:
> # recompute cache
> blocked = cl.ancestors(_gethiddenblockers(repo), inclusive=True)
> hidden = frozenset(r for r in hideable if r not in blocked)
> -
> # write cache to file
> try:
> data = struct.pack('%sI' % len(hidden), *hidden)
1. We have a "experimental" config section for such purpose. something
like `experimental.cachehidden` would do.
2. You are not writing the new result in case of invalid cache
3. Given that the current default should be "not use the cache" for now
I would see the current code structure (some function just exists for
the speudo code)::
hidden = hiddencomputation(…)
if repo.ui.config('experimental', 'cachehidden', False):
cache = readcache(…) # or return None if missing or invalid
if cache is not None and cache != hidden:
repo.ui.warn(…)
cache = None
if cache is None:
writecache(…)
return hidden
such structure will be easy to translate when we drop the config option:
hidden = readcache(…) # or return None if missing or invalid
if hidden is None:
hidden = hiddencomputation(…)
writecache(…)
return hidden
This implies merging patches 2 and 3. (the cache logic -may- be
partially introduced as uncalled function in prior patches if you want
to focus on series readability)
--
Pierre-Yves David
More information about the Mercurial-devel
mailing list