~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repofmt/pack_repo.py

  • Committer: Robert Collins
  • Date: 2007-10-17 04:21:52 UTC
  • mto: This revision was merged to the branch mainline in revision 2933.
  • Revision ID: robertc@robertcollins.net-20071017042152-vdjpy1o8jyvero69
Cleanup text index management in packs.

Show diffs side-by-side

added added

removed removed

Lines of Context:
475
475
        # aggregated revision index data
476
476
        self.revision_index = AggregateIndex()
477
477
        self.inventory_index = AggregateIndex()
 
478
        self.text_index = AggregateIndex()
478
479
        self.signature_index = AggregateIndex()
479
480
 
480
481
    def add_pack_to_memory(self, pack):
487
488
        self._packs[pack.name] = pack
488
489
        self.revision_index.add_index(pack.revision_index, pack)
489
490
        self.inventory_index.add_index(pack.inventory_index, pack)
 
491
        self.text_index.add_index(pack.text_index, pack)
490
492
        self.signature_index.add_index(pack.signature_index, pack)
491
 
        if self.repo._text_all_indices is not None:
492
 
            # text 'knits' have been used : update it.
493
 
            self.repo._text_all_indices.insert_index(0,
494
 
                pack.text_index)
495
493
        
496
494
    def _add_text_to_weave(self, file_id, revision_id, new_lines, parents,
497
495
        nostore_sha, random_revid):
498
496
        file_id_index = GraphIndexPrefixAdapter(
499
 
            self.repo._text_all_indices,
 
497
            self.text_index.combined_index,
500
498
            (file_id, ), 1,
501
 
            add_nodes_callback=self._new_pack.text_index.add_nodes)
 
499
            add_nodes_callback=self.text_index.add_callback)
502
500
        self.repo._text_knit._index._graph_index = file_id_index
503
501
        self.repo._text_knit._index._add_callback = file_id_index.add_nodes
504
502
        return self.repo._text_knit.add_lines_with_ghosts(
566
564
        self._execute_pack_operations(pack_operations)
567
565
        return True
568
566
 
569
 
    def refresh_text_index(self):
570
 
        """Refresh the text index mappings."""
571
 
        index_map, index_list = self._packs_list_to_pack_map_and_index_list(
572
 
            self.all_packs(), 'text_index')
573
 
        self.repo.weave_store._setup_knit(False)
574
 
        if self.repo._text_all_indices is not None:
575
 
            # refresh the pack map dict without replacing the instance.
576
 
            self.repo._text_pack_map.clear()
577
 
            self.repo._text_pack_map.update(index_map)
578
 
            # invs 'knit' accessed : update it.
579
 
            # XXX: API break - clearly a 'replace' method would be good?
580
 
            self.repo._text_all_indices._indices[:] = index_list
581
 
 
582
567
    def create_pack_from_packs(self, packs, suffix, revision_ids=None):
583
568
        """Create a new pack by reading data from other packs.
584
569
 
1050
1035
        self._packs.pop(pack.name)
1051
1036
        self.revision_index.remove_index(pack.revision_index, pack)
1052
1037
        self.inventory_index.remove_index(pack.inventory_index, pack)
 
1038
        self.text_index.remove_index(pack.text_index, pack)
1053
1039
        self.signature_index.remove_index(pack.signature_index, pack)
1054
1040
 
1055
1041
    def reset(self):
1060
1046
        # cached signature data
1061
1047
        self.repo._signature_knit = None
1062
1048
        self.signature_index.clear()
1063
 
        # no access object.
1064
 
        self.repo._text_knit_access = None
1065
 
        # no write-knit
 
1049
        # cached file text data
 
1050
        self.text_index.clear()
1066
1051
        self.repo._text_knit = None
1067
 
        # remove all constructed text data indices
1068
 
        self.repo._text_all_indices = None
1069
 
        # and the pack map
1070
 
        self.repo._text_pack_map = None
1071
1052
        # cached inventory data
1072
1053
        self.inventory_index.clear()
1073
1054
        # remove the open pack
1207
1188
            self._new_pack)
1208
1189
        self.inventory_index.add_writable_index(self._new_pack.inventory_index,
1209
1190
            self._new_pack)
 
1191
        self.text_index.add_writable_index(self._new_pack.text_index,
 
1192
            self._new_pack)
1210
1193
        self.signature_index.add_writable_index(self._new_pack.signature_index,
1211
1194
            self._new_pack)
1212
1195
 
1223
1206
        pack = self._new_pack
1224
1207
        self.revision_index.remove_index(pack.revision_index, pack)
1225
1208
        self.inventory_index.remove_index(pack.inventory_index, pack)
 
1209
        self.text_index.remove_index(pack.text_index, pack)
1226
1210
        self.signature_index.remove_index(pack.signature_index, pack)
1227
1211
        self._new_pack = None
1228
1212
        self.reset()
1232
1216
        # remove the pack's write indices from the aggregate indices.
1233
1217
        self.revision_index.remove_index(pack.revision_index, pack)
1234
1218
        self.inventory_index.remove_index(pack.inventory_index, pack)
 
1219
        self.text_index.remove_index(pack.text_index, pack)
1235
1220
        self.signature_index.remove_index(pack.signature_index, pack)
1236
1221
        if self._new_pack.data_inserted():
1237
1222
            # get all the data to disk and read to use
1243
1228
                # when autopack takes no steps, the names list is still
1244
1229
                # unsaved.
1245
1230
                self._save_pack_names()
1246
 
            # now setup the maps we need to access data again.
1247
 
            self.refresh_text_index()
1248
1231
        else:
1249
1232
            self._new_pack.abort()
1250
1233
        # forget what names there are - XXX should just refresh them and apply
1357
1340
        # XXX for check() which isn't updated yet
1358
1341
        self._transport = weavestore._transport
1359
1342
 
1360
 
    def _ensure_all_index(self, for_write=None):
1361
 
        """Create the combined index for all texts."""
1362
 
        if getattr(self.repo, '_text_all_indices', None) is not None:
1363
 
            return
1364
 
        pack_map, indices = self.repo._packs._make_index_map('.tix')
1365
 
        self.repo._text_pack_map = pack_map
1366
 
        if for_write or self.repo.is_in_write_group():
1367
 
            # allow writing: queue writes to a new index
1368
 
            indices.insert(0, self.repo._packs._new_pack.text_index)
1369
 
        self._setup_knit(self.repo.is_in_write_group())
1370
 
        self.repo._text_all_indices = CombinedGraphIndex(indices)
1371
 
 
1372
 
    def get_weave_or_empty(self, file_id, transaction, force_write=False):
 
1343
    def get_weave_or_empty(self, file_id, transaction):
1373
1344
        """Get a 'Knit' backed by the .tix indices.
1374
1345
 
1375
1346
        The transaction parameter is ignored.
1376
1347
        """
1377
 
        self._ensure_all_index()
1378
 
        if force_write or self.repo.is_in_write_group():
1379
 
            add_callback = self.repo._packs._new_pack.text_index.add_nodes
1380
 
            self.repo._text_pack_map[self.repo._packs._new_pack.text_index] = self.repo._open_pack_tuple
1381
 
        else:
1382
 
            add_callback = None # no data-adding permitted.
1383
 
 
1384
 
        file_id_index = GraphIndexPrefixAdapter(self.repo._text_all_indices,
 
1348
        self.repo._packs.ensure_loaded()
 
1349
        add_callback = self.repo._packs.text_index.add_callback
 
1350
        # setup knit specific objects
 
1351
        file_id_index = GraphIndexPrefixAdapter(
 
1352
            self.repo._packs.text_index.combined_index,
1385
1353
            (file_id, ), 1, add_nodes_callback=add_callback)
1386
1354
        knit_index = KnitGraphIndex(file_id_index,
1387
1355
            add_callback=file_id_index.add_nodes,
1390
1358
            self.transport.clone('..'),
1391
1359
            None,
1392
1360
            index=knit_index,
1393
 
            access_method=self.repo._text_knit_access,
 
1361
            access_method=self.repo._packs.text_index.knit_access,
1394
1362
            factory=knit.KnitPlainFactory())
1395
1363
 
1396
1364
    get_weave = get_weave_or_empty
1397
1365
 
1398
1366
    def __iter__(self):
1399
1367
        """Generate a list of the fileids inserted, for use by check."""
1400
 
        self._ensure_all_index()
 
1368
        self.repo._packs.ensure_loaded()
1401
1369
        ids = set()
1402
 
        for index, key, value, refs in self.repo._text_all_indices.iter_all_entries():
 
1370
        for index, key, value, refs in \
 
1371
            self.repo._packs.text_index.combined_index.iter_all_entries():
1403
1372
            ids.add(key[0])
1404
1373
        return iter(ids)
1405
1374
 
1406
1375
    def setup(self):
1407
 
        # we require that text 'knits' be accessed from within the write 
1408
 
        # group to be able to be written to, simply because it makes this
1409
 
        # code cleaner - we don't need to track all 'open' knits and 
1410
 
        # adjust them.
1411
 
        # prepare to do writes.
1412
 
        self._ensure_all_index(True)
1413
 
        self._setup_knit(True)
1414
 
    
1415
 
    def _setup_knit(self, for_write):
1416
 
        if for_write:
1417
 
            writer = (self.repo._packs._new_pack._writer, self.repo._packs._new_pack.text_index)
1418
 
        else:
1419
 
            writer = None
1420
 
        self.repo._text_knit_access = _PackAccess(
1421
 
            self.repo._text_pack_map, writer)
1422
 
        if for_write:
1423
 
            # a reused knit object for commit specifically.
1424
 
            self.repo._text_knit = self.get_weave_or_empty(
1425
 
                'all-texts', None, for_write)
1426
 
        else:
1427
 
            self.repo._text_knit = None
 
1376
        # a reused knit object for commit.
 
1377
        self.repo._text_knit = self.get_weave_or_empty(
 
1378
            'all-texts', None)
1428
1379
 
1429
1380
 
1430
1381
class InventoryKnitThunk(object):