Rev 5097: save() needs to know to add and remove entries from the disk index. in http://bzr.arbash-meinel.com/branches/bzr/lp/2.2.0b2-contained-pack

John Arbash Meinel john at arbash-meinel.com
Mon Mar 8 17:09:28 GMT 2010


At http://bzr.arbash-meinel.com/branches/bzr/lp/2.2.0b2-contained-pack

------------------------------------------------------------
revno: 5097
revision-id: john at arbash-meinel.com-20100308170924-ha2q41s161kfu1lc
parent: john at arbash-meinel.com-20100308164708-4hct67zbnppa4eea
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.2.0b2-contained-pack
timestamp: Mon 2010-03-08 11:09:24 -0600
message:
  save() needs to know to add and remove entries from the disk index.
-------------- next part --------------
=== modified file 'bzrlib/pack_collection.py'
--- a/bzrlib/pack_collection.py	2010-03-08 16:36:06 +0000
+++ b/bzrlib/pack_collection.py	2010-03-08 17:09:24 +0000
@@ -310,13 +310,20 @@
     def save(self):
         """Save the current in-memory content to disk."""
         # TODO: Ensure disk locking
+        (on_disk, active, d_removed, d_added, m_removed,
+         m_added) = self._diff_from_disk()
         builder = self._index_builder_class(reference_lists=0, key_elements=1)
-        # TODO: _diff_memos_from_disk
-        for name, value in self._memos.iteritems():
+        for name, value in active:
             builder.add_node((name,), value)
         self.transport.put_file(self.filename, builder.finish(),
                                 mode=self._do_get_file_mode())
         self._last_read_memos = set(self._memos.iteritems())
+        # TODO: We probably need to either return this info, or trigger
+        #       callbacks, etc so that higher level code can do something
+        for memo in d_removed:
+            self.remove_memo(*memo)
+        for memo in d_added:
+            self.add_memo(*memo)
 
 
 

=== modified file 'bzrlib/tests/test_pack_collection.py'
--- a/bzrlib/tests/test_pack_collection.py	2010-03-08 16:47:08 +0000
+++ b/bzrlib/tests/test_pack_collection.py	2010-03-08 17:09:24 +0000
@@ -171,54 +171,54 @@
         self.assertEqual(0, btree.key_count())
 
     def test_add_memo(self):
-        self.tracker.add_memo('test-name', 'content')
-        self.assertEqual('content', self.tracker.get_memo('test-name'))
-        self.assertEqual({'test-name': 'content'}, self.tracker._memos)
+        self.tracker.add_memo(*self._m1)
+        self.assertEqual('content1', self.tracker.get_memo('name1'))
+        self.assertEqual({'name1': 'content1'}, self.tracker._memos)
         self.assertEqual([], sorted(self.tracker._last_read_memos))
         self.tracker.save()
-        self.assertEqual({'test-name': 'content'}, self.tracker._memos)
-        self.assertEqual([('test-name', 'content')],
+        self.assertEqual({'name1': 'content1'}, self.tracker._memos)
+        self.assertEqual([('name1', 'content1')],
                          sorted(self.tracker._last_read_memos))
         btree = self.tracker._index_class(self.transport, 'meta', size=None)
         self.assertEqual(1, btree.key_count())
-        self.assertEqual([(('test-name',), 'content')],
+        self.assertEqual([(('name1',), 'content1')],
                  sorted([(n[1], n[2]) for n in btree.iter_all_entries()]))
 
     def test_get_missing_memo(self):
         self.assertRaises(KeyError, self.tracker.get_memo, 'not-there')
 
     def test_remove_memo(self):
-        self.tracker.add_memo('test-name', 'content')
-        self.tracker.add_memo('test-name2', 'content2')
-        self.assertEqual({'test-name': 'content',
-                          'test-name2': 'content2'}, self.tracker._memos)
+        self.tracker.add_memo(*self._m1)
+        self.tracker.add_memo(*self._m2)
+        self.assertEqual({'name1': 'content1',
+                          'name2': 'content2'}, self.tracker._memos)
         self.assertEqual([], sorted(self.tracker._last_read_memos))
         self.tracker.save()
-        self.tracker.remove_memo('test-name2', 'content2')
-        self.assertEqual([('test-name', 'content'),
-                          ('test-name2', 'content'),
+        self.tracker.remove_memo(*self._m2)
+        self.assertEqual([('name1', 'content1'),
+                          ('name2', 'content2'),
                          ], sorted(self.tracker._last_read_memos))
-        self.assertEqual({'test-name': 'content'}, self.tracker._memos)
+        self.assertEqual({'name1': 'content1'}, self.tracker._memos)
         # Before saving, we should have both keys
         btree = self.tracker._index_class(self.transport, 'meta', size=None)
         self.assertEqual(2, btree.key_count())
         self.tracker.save()
-        self.assertEqual([('test-name2', 'content')],
+        self.assertEqual([('name1', 'content1')],
                          sorted(self.tracker._last_read_memos))
         btree = self.tracker._index_class(self.transport, 'meta', size=None)
         self.assertEqual(1, btree.key_count())
 
     def test_add_with_concurrent_add(self):
-        self.tracker.add_memo('name', 'content')
+        self.tracker.add_memo(*self._m1)
         self.tracker.save()
         tracker2 = TrivialMemoTracker(self.transport, 'meta')
-        tracker2.add_memo('name2', 'content2')
-        self.tracker.add_memo('name3', 'content3')
+        tracker2.add_memo(*self._m2)
+        self.tracker.add_memo(*self._m3)
         tracker2.save()
         self.tracker.save()
         # When we save, tracker should notice that there was a new entry, and
         # add it to the in-memory data.
-        self.assertEqual({'name': 'content',
+        self.assertEqual({'name1': 'content1',
                           'name2': 'content2',
                           'name3': 'content3',
                          }, self.tracker._memos)
@@ -226,6 +226,22 @@
         btree = self.tracker._index_class(self.transport, 'meta', size=None)
         self.assertEqual(3, btree.key_count())
 
+    def test_concurrent_remove(self):
+        self.tracker.add_memo(*self._m1)
+        self.tracker.save()
+        tracker2 = TrivialMemoTracker(self.transport, 'meta')
+        tracker2.remove_memo(*self._m1)
+        self.tracker.add_memo(*self._m2)
+        tracker2.save()
+        self.tracker.save()
+        # When we save, tracker should notice that m1 was removed, and remove
+        # it from the in-memory structure.
+        self.assertEqual({'name2': 'content2',
+                         }, self.tracker._memos)
+        # And the on-disk record should also have all 3
+        btree = self.tracker._index_class(self.transport, 'meta', size=None)
+        self.assertEqual(1, btree.key_count())
+
     def test__diff_from_disk_no_changes(self):
         self.tracker.add_memo(*self._m1)
         self.tracker.save()



More information about the bazaar-commits mailing list