~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/repofmt/pack_repo.py

(spiv) Make better use of smart server when a local repository is stacked on
 a remote repository. (Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
53
53
from bzrlib.lock import LogicalLockResult
54
54
from bzrlib.repository import (
55
55
    CommitBuilder,
 
56
    _LazyListJoin,
56
57
    MetaDirRepository,
57
58
    MetaDirRepositoryFormat,
58
59
    RepositoryFormat,
1660
1661
        self._commit_builder_class = _commit_builder_class
1661
1662
        self._serializer = _serializer
1662
1663
        self._reconcile_fixes_text_parents = True
 
1664
        if self._format.supports_external_lookups:
 
1665
            self._unstacked_provider = graph.CachingParentsProvider(
 
1666
                self._make_parents_provider_unstacked())
 
1667
        else:
 
1668
            self._unstacked_provider = graph.CachingParentsProvider(self)
 
1669
        self._unstacked_provider.disable_cache()
1663
1670
 
1664
1671
    @needs_read_lock
1665
1672
    def _all_revision_ids(self):
1671
1678
        self._pack_collection._abort_write_group()
1672
1679
 
1673
1680
    def _make_parents_provider(self):
1674
 
        return graph.CachingParentsProvider(self)
 
1681
        if not self._format.supports_external_lookups:
 
1682
            return self._unstacked_provider
 
1683
        return graph.StackedParentsProvider(_LazyListJoin(
 
1684
            [self._unstacked_provider], self._fallback_repositories))
1675
1685
 
1676
1686
    def _refresh_data(self):
1677
1687
        if not self.is_locked():
1678
1688
            return
1679
1689
        self._pack_collection.reload_pack_names()
 
1690
        self._unstacked_provider.disable_cache()
 
1691
        self._unstacked_provider.enable_cache()
1680
1692
 
1681
1693
    def _start_write_group(self):
1682
1694
        self._pack_collection._start_write_group()
1684
1696
    def _commit_write_group(self):
1685
1697
        hint = self._pack_collection._commit_write_group()
1686
1698
        self.revisions._index._key_dependencies.clear()
 
1699
        # The commit may have added keys that were previously cached as
 
1700
        # missing, so reset the cache.
 
1701
        self._unstacked_provider.disable_cache()
 
1702
        self._unstacked_provider.enable_cache()
1687
1703
        return hint
1688
1704
 
1689
1705
    def suspend_write_group(self):
1730
1746
            if 'relock' in debug.debug_flags and self._prev_lock == 'w':
1731
1747
                note('%r was write locked again', self)
1732
1748
            self._prev_lock = 'w'
 
1749
            self._unstacked_provider.enable_cache()
1733
1750
            for repo in self._fallback_repositories:
1734
1751
                # Writes don't affect fallback repos
1735
1752
                repo.lock_read()
1750
1767
            if 'relock' in debug.debug_flags and self._prev_lock == 'r':
1751
1768
                note('%r was read locked again', self)
1752
1769
            self._prev_lock = 'r'
 
1770
            self._unstacked_provider.enable_cache()
1753
1771
            for repo in self._fallback_repositories:
1754
1772
                repo.lock_read()
1755
1773
            self._refresh_data()
1787
1805
    def unlock(self):
1788
1806
        if self._write_lock_count == 1 and self._write_group is not None:
1789
1807
            self.abort_write_group()
 
1808
            self._unstacked_provider.disable_cache()
1790
1809
            self._transaction = None
1791
1810
            self._write_lock_count = 0
1792
1811
            raise errors.BzrError(
1802
1821
            self.control_files.unlock()
1803
1822
 
1804
1823
        if not self.is_locked():
 
1824
            self._unstacked_provider.disable_cache()
1805
1825
            for repo in self._fallback_repositories:
1806
1826
                repo.unlock()
1807
1827