changeset 31804:726f24123f02

revlog: avoid applying delta chain on cache hit Previously, revlog.revision(raw=False) may try to apply the delta chain on _cache hit. That happens if flags are non-empty. This patch makes rawtext reused so delta chain application is avoided. "_cache" and "rev" are moved a bit to avoid unnecessary assignments.
author Jun Wu <quark@fb.com>
date Sun, 02 Apr 2017 18:40:13 -0700
parents 2be73f9720a8
children dca9b6922514
files mercurial/revlog.py
diffstat 1 files changed, 6 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlog.py	Sun Apr 02 18:29:24 2017 -0700
+++ b/mercurial/revlog.py	Sun Apr 02 18:40:13 2017 -0700
@@ -1268,6 +1268,7 @@
 
         cachedrev = None
         flags = None
+        rawtext = None
         if node == nullid:
             return ""
         if self._cache:
@@ -1283,11 +1284,12 @@
                 # no extra flags set, no flag processor runs, text = rawtext
                 if flags == REVIDX_DEFAULT_FLAGS:
                     return self._cache[2]
+                # rawtext is reusable. need to run flag processor
+                rawtext = self._cache[2]
 
             cachedrev = self._cache[1]
 
         # look up what we need to read
-        rawtext = None
         if rawtext is None:
             if rev is None:
                 rev = self.rev(node)
@@ -1305,15 +1307,17 @@
                 bins = bins[1:]
 
             rawtext = mdiff.patches(rawtext, bins)
+            self._cache = (node, rev, rawtext)
 
         if flags is None:
+            if rev is None:
+                rev = self.rev(node)
             flags = self.flags(rev)
 
         text, validatehash = self._processflags(rawtext, flags, 'read', raw=raw)
         if validatehash:
             self.checkhash(text, node, rev=rev)
 
-        self._cache = (node, rev, rawtext)
         return text
 
     def hash(self, text, p1, p2):