Submitter | Durham Goode |
---|---|
Date | Sept. 20, 2016, 7:36 p.m. |
Message ID | <22915866409350cbb530.1474400188@dev111.prn1.facebook.com> |
Download | mbox | patch |
Permalink | /patch/16690/ |
State | Superseded |
Headers | show |
Comments
Woops, this patch didn't change manifestlog.get() to actually use the directory cache in the treemanifest code path. Will resend with that fixed. On 9/20/16 12:36 PM, Durham Goode wrote: > # HG changeset patch > # User Durham Goode <durham@fb.com> > # Date 1474400113 25200 > # Tue Sep 20 12:35:13 2016 -0700 > # Node ID 22915866409350cbb5302289c05bb65bc1bfd308 > # Parent 52a206d772021194ab4356aeba2c73650851a624 > manifest: change manifestlog mancache to be directory based > > In the last patch we added a get() function that allows fetching directory level > treemanifestctxs. It didn't handle caching at directory level though, so we need to > change our mancache to support multiple directories. > > diff --git a/mercurial/manifest.py b/mercurial/manifest.py > --- a/mercurial/manifest.py > +++ b/mercurial/manifest.py > @@ -1021,9 +1021,16 @@ class manifestlog(object): > usetreemanifest = opts.get('treemanifest', usetreemanifest) > self._treeinmem = usetreemanifest > > + # A dictionary containing the cache for each directory > + self._dirmancache = {} > + > # We'll separate this into it's own cache once oldmanifest is no longer > # used > - self._mancache = repo.manifest._mancache > + self._dirmancache[''] = repo.manifest._mancache > + > + # A future patch makes this use the same config value as the existing > + # mancache > + self.cachesize = 4 > > @property > def _revlog(self): > @@ -1047,8 +1054,8 @@ class manifestlog(object): > _("cannot ask for manifest directory '%s' in a flat " > "manifest") % dir) > else: > - if node in self._mancache: > - cachemf = self._mancache[node] > + if node in self._dirmancache.get(dir, ()): > + cachemf = self._dirmancache[dir][node] > # The old manifest may put non-ctx manifests in the cache, so > # skip those since they don't implement the full api. > if (isinstance(cachemf, manifestctx) or > @@ -1059,8 +1066,13 @@ class manifestlog(object): > m = treemanifestctx(self._revlog, '', node) > else: > m = manifestctx(self._revlog, node) > - if node != revlog.nullid: > - self._mancache[node] = m > + > + if node != revlog.nullid: > + mancache = self._dirmancache.get(dir) > + if not mancache: > + mancache = util.lrucachedict(self.cachesize) > + self._dirmancache[dir] = mancache > + mancache[node] = m > return m > > def add(self, m, transaction, link, p1, p2, added, removed): > _______________________________________________ > Mercurial-devel mailing list > Mercurial-devel@mercurial-scm.org > https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=DQIGaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=VLB2IFCfd1hwkNj48uX3kSd5dnDqItOdYqexb8hkHao&s=aJp4DUf7hp6QQ0EuIT3P_I_LQ9qrcccsIM9km8X18o8&e=
Patch
diff --git a/mercurial/manifest.py b/mercurial/manifest.py --- a/mercurial/manifest.py +++ b/mercurial/manifest.py @@ -1021,9 +1021,16 @@ class manifestlog(object): usetreemanifest = opts.get('treemanifest', usetreemanifest) self._treeinmem = usetreemanifest + # A dictionary containing the cache for each directory + self._dirmancache = {} + # We'll separate this into it's own cache once oldmanifest is no longer # used - self._mancache = repo.manifest._mancache + self._dirmancache[''] = repo.manifest._mancache + + # A future patch makes this use the same config value as the existing + # mancache + self.cachesize = 4 @property def _revlog(self): @@ -1047,8 +1054,8 @@ class manifestlog(object): _("cannot ask for manifest directory '%s' in a flat " "manifest") % dir) else: - if node in self._mancache: - cachemf = self._mancache[node] + if node in self._dirmancache.get(dir, ()): + cachemf = self._dirmancache[dir][node] # The old manifest may put non-ctx manifests in the cache, so # skip those since they don't implement the full api. if (isinstance(cachemf, manifestctx) or @@ -1059,8 +1066,13 @@ class manifestlog(object): m = treemanifestctx(self._revlog, '', node) else: m = manifestctx(self._revlog, node) - if node != revlog.nullid: - self._mancache[node] = m + + if node != revlog.nullid: + mancache = self._dirmancache.get(dir) + if not mancache: + mancache = util.lrucachedict(self.cachesize) + self._dirmancache[dir] = mancache + mancache[node] = m return m def add(self, m, transaction, link, p1, p2, added, removed):