Rev 2816: Move flush and reset operations to the pack collection rather than the thunk layers. in http://people.ubuntu.com/~robertc/baz2.0/repository
Robert Collins
robertc at robertcollins.net
Sun Oct 14 23:30:43 BST 2007
At http://people.ubuntu.com/~robertc/baz2.0/repository
------------------------------------------------------------
revno: 2816
revision-id: robertc at robertcollins.net-20071014223035-098mbc47ba3y3bi2
parent: robertc at robertcollins.net-20071014215923-16mwtp9u3796eg0y
committer: Robert Collins <robertc at robertcollins.net>
branch nick: repository
timestamp: Mon 2007-10-15 08:30:35 +1000
message:
Move flush and reset operations to the pack collection rather than the thunk layers.
modified:
bzrlib/repofmt/pack_repo.py pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
=== modified file 'bzrlib/repofmt/pack_repo.py'
--- a/bzrlib/repofmt/pack_repo.py 2007-10-14 21:59:23 +0000
+++ b/bzrlib/repofmt/pack_repo.py 2007-10-14 22:30:35 +0000
@@ -254,6 +254,91 @@
self._execute_pack_operations(pack_operations)
return True
+ def flush_revision_signature_indices(self, new_name):
+ """Write out pending indices."""
+ # write a revision index (might be empty)
+ new_index_name = self.repo._revision_store.name_to_revision_index_name(new_name)
+ revision_index_length = self._index_transport.put_file(
+ new_index_name, self.repo._revision_write_index.finish())
+ rev_index = GraphIndex(self._index_transport, new_index_name,
+ revision_index_length)
+ if self.repo._revision_all_indices is None:
+ # create a pack map for the autopack code - XXX finish
+ # making a clear managed list of packs, indices and use
+ # that in these mapping classes
+ self.repo._revision_pack_map = self._make_index_map('.rix')[0]
+ else:
+ del self.repo._revision_pack_map[self.repo._revision_write_index]
+ self.repo._revision_write_index = None
+ self.repo._revision_pack_map[rev_index] = (self._pack_tuple(new_name))
+ # revisions 'knit' accessed : update it.
+ self.repo._revision_all_indices.insert_index(0, rev_index)
+ # remove the write buffering index. XXX: API break
+ # - clearly we need a remove_index call too.
+ del self.repo._revision_all_indices._indices[1]
+ # reset the knit access writer
+ self.repo._revision_knit_access.set_writer(None, None, (None, None))
+
+ # write a signatures index (might be empty)
+ new_index_name = self.repo._revision_store.name_to_signature_index_name(new_name)
+ signature_index_length = self._index_transport.put_file(
+ new_index_name, self.repo._signature_write_index.finish())
+ self.repo._signature_write_index = None
+ sig_index = GraphIndex(self._index_transport, new_index_name,
+ signature_index_length)
+ if self.repo._signature_all_indices is not None:
+ # sigatures 'knit' accessed : update it.
+ self.repo._signature_all_indices.insert_index(0, sig_index)
+ # remove the write buffering index. XXX: API break
+ # - clearly we need a remove_index call too.
+ del self.repo._signature_all_indices._indices[1]
+ # reset the knit access writer
+ self.repo._signature_knit_access.set_writer(None, None, (None, None))
+ return (rev_index, revision_index_length, sig_index,
+ signature_index_length)
+
+ def flush_inventory_index(self, new_name):
+ """Write the index out to new_name."""
+ # write an index (might be empty)
+ new_index_name = self.repo._inv_thunk.name_to_inv_index_name(new_name)
+ inventory_index_length = self._index_transport.put_file(
+ new_index_name, self.repo._inv_write_index.finish())
+ self.repo._inv_write_index = None
+ inv_index = GraphIndex(self._index_transport, new_index_name,
+ inventory_index_length)
+ if self.repo._inv_all_indices is not None:
+ # inv 'knit' has been used, replace the mutated memory index
+ # with the new on-disk one. XXX: is this really a good idea?
+ # perhaps just keep using the memory one ?
+ self.repo._inv_all_indices.insert_index(0, inv_index)
+ # remove the write buffering index. XXX: API break
+ # - clearly we need a remove_index call too.
+ del self.repo._inv_all_indices._indices[1]
+ self.repo._inv_knit_access.set_writer(None, None, (None, None))
+ else:
+ self.repo._inv_pack_map = None
+ return inv_index, inventory_index_length
+
+ def flush_text_index(self, new_name):
+ """Write the index out to new_name."""
+ # write a revision index (might be empty)
+ new_index_name = self.repo.weave_store.name_to_text_index_name(new_name)
+ text_index_length = self._index_transport.put_file(
+ new_index_name, self.repo._text_write_index.finish())
+ txt_index = GraphIndex(self._index_transport, new_index_name,
+ text_index_length)
+ self.repo._text_write_index = None
+ self.repo.weave_store._setup_knit(False)
+ if self.repo._text_all_indices is not None:
+ # text 'knits' have been used, replace the mutated memory index
+ # with the new on-disk one. XXX: is this really a good idea?
+ # perhaps just keep using the memory one ?
+ self.repo._text_all_indices.insert_index(0, txt_index)
+ # remove the write buffering index. XXX: API break
+ # - clearly we need a remove_index call too.
+ del self.repo._text_all_indices._indices[1]
+ return txt_index, text_index_length
+
def create_pack_from_packs(self, packs, suffix, revision_ids=None):
"""Create a new pack by reading data from other packs.
@@ -808,6 +893,35 @@
self._names.pop(name)
def reset(self):
+ """Clear all cached data."""
+ # cached revision data
+ self.repo._revision_knit = None
+ self.repo._revision_write_index = None
+ self.repo._revision_all_indices = None
+ self.repo._revision_knit_access = None
+ # cached signature data
+ self.repo._signature_knit = None
+ self.repo._signature_write_index = None
+ self.repo._signature_all_indices = None
+ self.repo._signature_knit_access = None
+ # remove any accumlating index of text data
+ self.repo._text_write_index = None
+ # no access object.
+ self.repo._text_knit_access = None
+ # no write-knit
+ self.repo._text_knit = None
+ # remove all constructed text data indices
+ self.repo._text_all_indices = None
+ # and the pack map
+ self.repo._text_pack_map = None
+ # remove any accumlating index of inv data
+ self.repo._inv_write_index = None
+ # remove all constructed inv data indices
+ self.repo._inv_all_indices = None
+ # remove the knit access object
+ self.repo._inv_knit_access = None
+ self.repo._inv_pack_map = None
+ # information about packs.
self._names = None
self.packs = []
self._packs = {}
@@ -900,7 +1014,7 @@
self.release_names()
def setup(self):
- # cannot add names if we're not in a 'write lock'.
+ # Do not permit preparation for writing if we're not in a 'write lock'.
if not self.repo.is_write_locked():
raise errors.NotWriteLocked(self)
@@ -923,9 +1037,6 @@
def _abort_write_group(self):
# FIXME: just drop the transient index.
- self.repo._revision_store.reset()
- self.repo.weave_store.reset()
- self.repo._inv_thunk.reset()
# forget what names there are
self.reset()
self._open_pack_hash = None
@@ -937,13 +1048,12 @@
if data_inserted:
self._open_pack_writer.end()
new_name = self._open_pack_hash.hexdigest()
- txt_index, text_index_length = self.repo.weave_store.flush(
- new_name)
+ txt_index, text_index_length = self.flush_text_index(new_name)
inv_index, inventory_index_length = \
- self.repo._inv_thunk.flush(new_name)
+ self.flush_inventory_index(new_name)
rev_index, revision_index_length, \
sig_index, signature_index_length = \
- self.repo._revision_store.flush(new_name)
+ self.flush_revision_signature_indices(new_name)
new_pack = Pack(self._upload_transport.clone('../packs/'),
new_name, rev_index, inv_index, txt_index, sig_index)
self._write_stream.close()
@@ -964,9 +1074,6 @@
else:
# remove the pending upload
self._upload_transport.delete(self.repo._open_pack_tuple[1])
- self.repo._revision_store.reset()
- self.repo.weave_store.reset()
- self.repo._inv_thunk.reset()
# forget what names there are - should just refresh and deal with the
# delta.
self.reset()
@@ -1064,49 +1171,6 @@
return True
return False
- def flush(self, new_name):
- """Write out pending indices."""
- # write a revision index (might be empty)
- new_index_name = self.name_to_revision_index_name(new_name)
- revision_index_length = self.transport.put_file(
- new_index_name, self.repo._revision_write_index.finish())
- rev_index = GraphIndex(self.transport, new_index_name,
- revision_index_length)
- if self.repo._revision_all_indices is None:
- # create a pack map for the autopack code - XXX finish
- # making a clear managed list of packs, indices and use
- # that in these mapping classes
- self.repo._revision_pack_map = self.repo._packs._make_index_map('.rix')[0]
- else:
- del self.repo._revision_pack_map[self.repo._revision_write_index]
- self.repo._revision_write_index = None
- self.repo._revision_pack_map[rev_index] = (self.repo._packs._pack_tuple(new_name))
- # revisions 'knit' accessed : update it.
- self.repo._revision_all_indices.insert_index(0, rev_index)
- # remove the write buffering index. XXX: API break
- # - clearly we need a remove_index call too.
- del self.repo._revision_all_indices._indices[1]
- # reset the knit access writer
- self.repo._revision_knit_access.set_writer(None, None, (None, None))
-
- # write a signatures index (might be empty)
- new_index_name = self.name_to_signature_index_name(new_name)
- signature_index_length = self.transport.put_file(
- new_index_name, self.repo._signature_write_index.finish())
- self.repo._signature_write_index = None
- sig_index = GraphIndex(self.transport, new_index_name,
- signature_index_length)
- if self.repo._signature_all_indices is not None:
- # sigatures 'knit' accessed : update it.
- self.repo._signature_all_indices.insert_index(0, sig_index)
- # remove the write buffering index. XXX: API break
- # - clearly we need a remove_index call too.
- del self.repo._signature_all_indices._indices[1]
- # reset the knit access writer
- self.repo._signature_knit_access.set_writer(None, None, (None, None))
- return (rev_index, revision_index_length, sig_index,
- signature_index_length)
-
def name_to_revision_index_name(self, name):
"""The revision index is the name + .rix."""
return name + '.rix'
@@ -1115,19 +1179,6 @@
"""The signature index is the name + .six."""
return name + '.six'
- def reset(self):
- """Clear all cached data."""
- # cached revision data
- self.repo._revision_knit = None
- self.repo._revision_write_index = None
- self.repo._revision_all_indices = None
- self.repo._revision_knit_access = None
- # cached signature data
- self.repo._signature_knit = None
- self.repo._signature_write_index = None
- self.repo._signature_all_indices = None
- self.repo._signature_knit_access = None
-
def setup(self):
# setup in-memory indices to accumulate data.
self.repo._revision_write_index = InMemoryGraphIndex(1)
@@ -1198,26 +1249,6 @@
self._setup_knit(self.repo.is_in_write_group())
self.repo._text_all_indices = CombinedGraphIndex(indices)
- def flush(self, new_name):
- """Write the index out to new_name."""
- # write a revision index (might be empty)
- new_index_name = self.name_to_text_index_name(new_name)
- text_index_length = self.transport.put_file(
- new_index_name, self.repo._text_write_index.finish())
- txt_index = GraphIndex(self.transport, new_index_name,
- text_index_length)
- self.repo._text_write_index = None
- self._setup_knit(False)
- if self.repo._text_all_indices is not None:
- # text 'knits' have been used, replace the mutated memory index
- # with the new on-disk one. XXX: is this really a good idea?
- # perhaps just keep using the memory one ?
- self.repo._text_all_indices.insert_index(0, txt_index)
- # remove the write buffering index. XXX: API break
- # - clearly we need a remove_index call too.
- del self.repo._text_all_indices._indices[1]
- return txt_index, text_index_length
-
def get_weave_or_empty(self, file_id, transaction, force_write=False):
"""Get a 'Knit' backed by the .tix indices.
@@ -1256,19 +1287,6 @@
"""The text index is the name + .tix."""
return name + '.tix'
- def reset(self):
- """Clear all cached data."""
- # remove any accumlating index of text data
- self.repo._text_write_index = None
- # no access object.
- self.repo._text_knit_access = None
- # no write-knit
- self.repo._text_knit = None
- # remove all constructed text data indices
- self.repo._text_all_indices = None
- # and the pack map
- self.repo._text_pack_map = None
-
def setup(self):
# setup in-memory indices to accumulate data.
self.repo._text_write_index = InMemoryGraphIndex(reference_lists=2,
@@ -1326,28 +1344,6 @@
self.repo._inv_all_indices = CombinedGraphIndex(indices)
self.repo._inv_pack_map = pack_map
- def flush(self, new_name):
- """Write the index out to new_name."""
- # write an index (might be empty)
- new_index_name = self.name_to_inv_index_name(new_name)
- inventory_index_length = self.transport.put_file(
- new_index_name, self.repo._inv_write_index.finish())
- self.repo._inv_write_index = None
- inv_index = GraphIndex(self.transport, new_index_name,
- inventory_index_length)
- if self.repo._inv_all_indices is not None:
- # inv 'knit' has been used, replace the mutated memory index
- # with the new on-disk one. XXX: is this really a good idea?
- # perhaps just keep using the memory one ?
- self.repo._inv_all_indices.insert_index(0, inv_index)
- # remove the write buffering index. XXX: API break
- # - clearly we need a remove_index call too.
- del self.repo._inv_all_indices._indices[1]
- self.repo._inv_knit_access.set_writer(None, None, (None, None))
- else:
- self.repo._inv_pack_map = None
- return inv_index, inventory_index_length
-
def get_weave(self):
"""Get a 'Knit' that contains inventory data."""
self._ensure_all_index()
@@ -1375,16 +1371,6 @@
"""The inv index is the name + .iix."""
return name + '.iix'
- def reset(self):
- """Clear all cached data."""
- # remove any accumlating index of inv data
- self.repo._inv_write_index = None
- # remove all constructed inv data indices
- self.repo._inv_all_indices = None
- # remove the knit access object
- self.repo._inv_knit_access = None
- self.repo._inv_pack_map = None
-
def setup(self):
# setup in-memory indices to accumulate data.
# - we want to map compression only, but currently the knit code hasn't
@@ -1439,9 +1425,6 @@
def _refresh_data(self):
if self._write_lock_count == 1 or self.control_files._lock_count==1:
- self._revision_store.reset()
- self.weave_store.reset()
- self._inv_thunk.reset()
# forget what names there are
self._packs.reset()
More information about the bazaar-commits
mailing list