Rev 3798: Create a rudimentary CHK page cache. in http://people.ubuntu.com/~robertc/baz2.0/repository

Robert Collins robertc at robertcollins.net
Thu Dec 4 21:51:57 GMT 2008


At http://people.ubuntu.com/~robertc/baz2.0/repository

------------------------------------------------------------
revno: 3798
revision-id: robertc at robertcollins.net-20081204215124-nhlwju6pj8dnmkwb
parent: robertc at robertcollins.net-20081204175242-jfz0abhsf0f684g3
committer: Robert Collins <robertc at robertcollins.net>
branch nick: repository
timestamp: Fri 2008-12-05 08:51:24 +1100
message:
  Create a rudimentary CHK page cache.
modified:
  bzrlib/chk_map.py              chk_map.py-20081001014447-ue6kkuhofvdecvxa-1
=== modified file 'bzrlib/chk_map.py'
--- a/bzrlib/chk_map.py	2008-12-02 23:56:25 +0000
+++ b/bzrlib/chk_map.py	2008-12-04 21:51:24 +0000
@@ -38,10 +38,16 @@
 """
 
 import heapq
+
 from bzrlib import lazy_import
 lazy_import.lazy_import(globals(), """
 from bzrlib import versionedfile
 """)
+from bzrlib.lru_cache import LRUCache
+
+# approx 2MB
+_PAGE_CACHE_SIZE = 2*1024*1024 / 4*1024
+_page_cache = LRUCache(_PAGE_CACHE_SIZE)
 
 
 class CHKMap(object):
@@ -711,12 +717,29 @@
                             nodes.append(node)
                         break
         if keys:
+            # Look in the page cache for some more bytes
+            found_keys = set()
+            for key in keys:
+                try:
+                    bytes = _page_cache[key]
+                except KeyError:
+                    continue
+                else:
+                    node = _deserialise(bytes, key)
+                    nodes.append(node)
+                    self._items[keys[key]] = node
+                    found_keys.add(key)
+            for key in found_keys:
+                del keys[key]
+        if keys:
             # demand load some pages.
             stream = store.get_record_stream(keys, 'unordered', True)
             for record in stream:
-                node = _deserialise(record.get_bytes_as('fulltext'), record.key)
+                bytes = record.get_bytes_as('fulltext')
+                node = _deserialise(bytes, record.key)
                 nodes.append(node)
                 self._items[keys[record.key]] = node
+                _page_cache.add(record.key, bytes)
         return nodes
 
     def map(self, store, key, value):




More information about the bazaar-commits mailing list