Rev 415: Use local revno<=>revid caches for specific help. in http://bazaar.launchpad.net/~jameinel/loggerhead/history_db

John Arbash Meinel john at arbash-meinel.com
Fri Apr 30 23:41:46 BST 2010


At http://bazaar.launchpad.net/~jameinel/loggerhead/history_db

------------------------------------------------------------
revno: 415
revision-id: john at arbash-meinel.com-20100430224137-sijt3o96cms5n1jv
parent: john at arbash-meinel.com-20100430222722-zgzx4a0d92xvhwii
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: history_db
timestamp: Fri 2010-04-30 17:41:37 -0500
message:
  Use local revno<=>revid caches for specific help.
  
  We end up asking for the revno or revid multiple times, so use something
  quick to handle that case.
-------------- next part --------------
=== modified file 'loggerhead/history.py'
--- a/loggerhead/history.py	2010-04-30 22:27:22 +0000
+++ b/loggerhead/history.py	2010-04-30 22:41:37 +0000
@@ -243,6 +243,11 @@
         self._branch = branch
         self._branch_tags = None
         self._inventory_cache = {}
+        # TODO: These could all be cached globally in a thread-safe LRUCache
+        #       which then used (tip_revision, revid) or (tip_revision, revno)
+        #       as the key.
+        self._revno_revid_cache = {}
+        self._revid_revno_cache = {}
         self._querier = _get_querier(branch)
         if self._querier is None:
             assert cache_path is not None
@@ -271,6 +276,8 @@
     def get_revno(self, revid):
         if revid is None:
             return 'unknown'
+        if revid in self._revid_revno_cache:
+            return self._revid_revno_cache[revid]
         try:
             revnos = self._querier.get_dotted_revno_range_multi([revid])
             dotted_revno = revnos[revid]
@@ -279,12 +286,23 @@
             import sys
             e = sys.exc_info()
             return 'unknown'
-        return '.'.join(map(str, dotted_revno))
+        revno_str = '.'.join(map(str, dotted_revno))
+        self._revno_revid_cache[revno_str] = revid
+        self._revid_revno_cache[revid] = revno_str
+        return revno_str
 
-    def get_dotted_to_rev_id(self, dotted_revnos):
+    def get_revid_for_revno(self, revno_str):
         # TODO: Create a memory cache, doing bi-directional mapping, possibly
         #       persisting between HTTP requests.
-        return self._querier.get_revision_ids(dotted_revnos)
+        if revno_str in self._revno_revid_cache:
+            return self._revno_revid_cache[revno_str]
+        dotted_revno = tuple(map(int, revno_str.split('.')))
+        revnos = self._querier.get_revision_ids([dotted_revno])
+        revnos = dict([('.'.join(map(str, drn)), ri) for drn, ri in revnos])
+        self._revno_revid_cache.update(revnos)
+        self._revid_revno_cache.update(
+            [(ri, rn) for rn, ri in revnos.iteritems()])
+        return revnos[revno_str]
 
     def _get_lh_parent(self, revid):
         """Get the left-hand parent of a given revision id."""
@@ -364,8 +382,7 @@
             return self.last_revid
         try:
             if self.revno_re.match(revid):
-                revno = tuple(map(int, revid.split('.')))
-                val = self.get_dotted_to_rev_id([revno])[revno]
+                val = self.get_revid_for_revno([revid])[revid]
                 # XXX: Do this more cleanly
                 if val is None:
                     raise KeyError



More information about the bazaar-commits mailing list