Mercurial > hg-stable
changeset 29834:27c0792e834c
manifest: break mancache into two caches
The old manifest cache cached both the inmemory representation and the raw text.
As part of the manifest refactor we want to separate the storage format from the
in memory representation, so let's split this cache into two caches.
This will let other manifest implementations participate in the in memory cache,
while allowing the revlog based implementations to still depend on the full text
caching where necessary.
author | Durham Goode <durham@fb.com> |
---|---|
date | Wed, 17 Aug 2016 13:25:13 -0700 |
parents | 61a4cdc98307 |
children | 58d4ecdc531e |
files | mercurial/bundlerepo.py mercurial/manifest.py |
diffstat | 2 files changed, 10 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/bundlerepo.py Thu Aug 18 11:32:02 2016 -0400 +++ b/mercurial/bundlerepo.py Wed Aug 17 13:25:13 2016 -0700 @@ -205,7 +205,7 @@ node = self.node(node) if node in self._mancache: - result = self._mancache[node][0].text() + result = self._mancache[node].text() else: result = manifest.manifest.revision(self, nodeorrev) return result
--- a/mercurial/manifest.py Thu Aug 18 11:32:02 2016 -0400 +++ b/mercurial/manifest.py Wed Aug 17 13:25:13 2016 -0700 @@ -908,6 +908,7 @@ usetreemanifest = opts.get('treemanifest', usetreemanifest) usemanifestv2 = opts.get('manifestv2', usemanifestv2) self._mancache = util.lrucachedict(cachesize) + self._fulltextcache = util.lrucachedict(cachesize) self._treeinmem = usetreemanifest self._treeondisk = usetreemanifest self._usemanifestv2 = usemanifestv2 @@ -1000,7 +1001,7 @@ if node == revlog.nullid: return self._newmanifest() # don't upset local cache if node in self._mancache: - return self._mancache[node][0] + return self._mancache[node] if self._treeondisk: def gettext(): return self.revision(node) @@ -1014,7 +1015,8 @@ text = self.revision(node) m = self._newmanifest(text) arraytext = array.array('c', text) - self._mancache[node] = (m, arraytext) + self._mancache[node] = m + self._fulltextcache[node] = arraytext return m def readshallow(self, node): @@ -1034,7 +1036,7 @@ return None, None def add(self, m, transaction, link, p1, p2, added, removed): - if (p1 in self._mancache and not self._treeinmem + if (p1 in self._fulltextcache and not self._treeinmem and not self._usemanifestv2): # If our first parent is in the manifest cache, we can # compute a delta here using properties we know about the @@ -1046,7 +1048,7 @@ work = heapq.merge([(x, False) for x in added], [(x, True) for x in removed]) - arraytext, deltatext = m.fastdelta(self._mancache[p1][1], work) + arraytext, deltatext = m.fastdelta(self._fulltextcache[p1], work) cachedelta = self.rev(p1), deltatext text = util.buffer(arraytext) n = self.addrevision(text, transaction, link, p1, p2, cachedelta) @@ -1065,7 +1067,8 @@ n = self.addrevision(text, transaction, link, p1, p2) arraytext = array.array('c', text) - self._mancache[n] = (m, arraytext) + self._mancache[n] = m + self._fulltextcache[n] = arraytext return n @@ -1092,5 +1095,6 @@ def clearcaches(self): super(manifest, self).clearcaches() + self._fulltextcache.clear() self._mancache.clear() self._dirlogcache = {'': self}