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.
--- 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}