manifest: break mancache into two caches
authorDurham Goode <durham@fb.com>
Wed, 17 Aug 2016 13:25:13 -0700
changeset 29823 27c0792e834c
parent 29822 61a4cdc98307
child 29824 58d4ecdc531e
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.
mercurial/bundlerepo.py
mercurial/manifest.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
--- 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}