Rev 2810: Merge final n bugfixes. in http://people.ubuntu.com/~robertc/baz2.0/repository

Robert Collins robertc at robertcollins.net
Thu Oct 11 04:46:16 BST 2007


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

------------------------------------------------------------
revno: 2810
revision-id: robertc at robertcollins.net-20071011034606-8buvhyrpsuk2w6hy
parent: robertc at robertcollins.net-20071011023106-1khgb5vi0yl4ti67
parent: robertc at robertcollins.net-20071011031741-psulszdaua6bbxcg
committer: Robert Collins <robertc at robertcollins.net>
branch nick: repository
timestamp: Thu 2007-10-11 13:46:06 +1000
message:
  Merge final n bugfixes.
modified:
  bzrlib/index.py                index.py-20070712131115-lolkarso50vjr64s-1
  bzrlib/tests/test_index.py     test_index.py-20070712131115-lolkarso50vjr64s-2
    ------------------------------------------------------------
    revno: 2592.1.25.2.7.1.28.1.6.1.3.1.9.2.1.3.74.1.31.3.18.1.9.1.2.1.12.1.8.1.46.1.18.1.16
    revision-id: robertc at robertcollins.net-20071011031741-psulszdaua6bbxcg
    parent: robertc at robertcollins.net-20071011022646-fxw9pt0ohs7662sf
    committer: Robert Collins <robertc at robertcollins.net>
    branch nick: index
    timestamp: Thu 2007-10-11 13:17:41 +1000
    message:
      Corner case when parsing repeated sections - the bottom section of a region may not be parsed, so we need to manually advance past that.
    modified:
      bzrlib/index.py                index.py-20070712131115-lolkarso50vjr64s-1
      bzrlib/tests/test_index.py     test_index.py-20070712131115-lolkarso50vjr64s-2
=== modified file 'bzrlib/index.py'
--- a/bzrlib/index.py	2007-10-11 02:31:06 +0000
+++ b/bzrlib/index.py	2007-10-11 03:46:06 +0000
@@ -468,6 +468,9 @@
             keys supplied. No additional keys will be returned, and every
             key supplied that is in the index will be returned.
         """
+        # PERFORMANCE TODO: parse and bisect all remaining data at some
+        # threshold of total-index processing/get calling layers that expect to
+        # read the entire index to use the iter_all_entries  method instead.
         keys = set(keys)
         if not keys:
             return []
@@ -736,13 +739,18 @@
         # trim the data.
         # end first:
         end = offset + len(data)
+        high_parsed = offset
         while True:
-            index = self._parsed_byte_index(offset)
             # Trivial test - if the current index's end is within the
             # low-matching parsed range, we're done.
+            index = self._parsed_byte_index(high_parsed)
             if end < self._parsed_byte_map[index][1]:
                 return
-            if self._parse_segment(offset, data, end, index):
+            # print "[%d:%d]" % (offset, end), \
+            #     self._parsed_byte_map[index:index + 2]
+            high_parsed, last_segment = self._parse_segment(
+                offset, data, end, index)
+            if last_segment:
                 return
 
     def _parse_segment(self, offset, data, end, index):
@@ -754,6 +762,10 @@
         :param index: The current index into the parsed bytes map.
         :return: True if the parsed segment is the last possible one in the
             range of data.
+        :return: high_parsed_byte, last_segment.
+            high_parsed_byte is the location of the highest parsed byte in this
+            segment, last_segment is True if the parsed segment is the last
+            possible one in the data block.
         """
         # default is to use all data
         trim_end = None
@@ -830,7 +842,8 @@
             # print 'removing end', offset, trim_end, repr(data[trim_end:])
         # adjust offset and data to the parseable data.
         trimmed_data = data[trim_start:trim_end]
-        assert trimmed_data, 'read unneeded data'
+        assert trimmed_data, 'read unneeded data [%d:%d] from [%d:%d]' % (
+            trim_start, trim_end, offset, offset + len(data))
         if trim_start:
             offset += trim_start
         # print "parsing", repr(trimmed_data)
@@ -870,7 +883,7 @@
             self._bisect_nodes[key] = node_value
             # print "parsed ", key
         self._parsed_bytes(offset, first_key, offset + len(trimmed_data), key)
-        return last_segment
+        return offset + len(trimmed_data), last_segment
 
     def _parsed_bytes(self, start, start_key, end, end_key):
         """Mark the bytes from start to end as parsed.

=== modified file 'bzrlib/tests/test_index.py'
--- a/bzrlib/tests/test_index.py	2007-10-11 02:26:46 +0000
+++ b/bzrlib/tests/test_index.py	2007-10-11 03:17:41 +0000
@@ -460,24 +460,25 @@
             return (str(number) + 'X'*100,)
         def make_value(number):
             return 'Y'*100
-        for counter in range(64):
+        for counter in range(128):
             nodes.append((make_key(counter), make_value(counter), ()))
         index = self.make_index(nodes=nodes)
         result = index.lookup_keys_via_location(
             [(index._size // 2, ('40', ))])
         # and we should have a parse map that includes the header and the
         # region that was parsed after trimming.
-        self.assertEqual([(0, 3972), (5001, 8914)], index._parsed_byte_map)
-        self.assertEqual([(None, make_key(26)), (make_key(31), make_key(48))],
+        self.assertEqual([(0, 3991), (11622, 15534)], index._parsed_byte_map)
+        self.assertEqual([(None, make_key(116)), (make_key(35), make_key(51))],
             index._parsed_key_map)
         # now ask for two keys, right before and after the parsed region
         result = index.lookup_keys_via_location(
-            [(4900, make_key(30)), (8914, make_key(49))])
+            [(11450, make_key(34)), (15534, make_key(52))])
         self.assertEqual([
-            ((4900, make_key(30)), (index, make_key(30), make_value(30))),
-            ((8914, make_key(49)), (index, make_key(49), make_value(49))),
+            ((11450, make_key(34)), (index, make_key(34), make_value(34))),
+            ((15534, make_key(52)), (index, make_key(52), make_value(52))),
             ],
             result)
+        self.assertEqual([(0, 3991), (9975, 17799)], index._parsed_byte_map)
 
     def test_lookup_missing_key_answers_without_io_when_map_permits(self):
         # generate a big enough index that we only read some of it on a typical



More information about the bazaar-commits mailing list