# HG changeset patch # User Durham Goode # Date 1471465513 25200 # Node ID 27c0792e834c7aa37c3f09d1712d98a78f7758d9 # Parent 61a4cdc98307f9fbd4d78385df447788260f38cb 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. diff -r 61a4cdc98307 -r 27c0792e834c mercurial/bundlerepo.py --- 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 diff -r 61a4cdc98307 -r 27c0792e834c mercurial/manifest.py --- 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}