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