~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/tests/test_remote.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2009-03-24 23:19:12 UTC
  • mfrom: (4190.1.6 integration)
  • Revision ID: pqm@pqm.ubuntu.com-20090324231912-rb0kgktzkvge8aea
(robertc) Negatively cache ghosts and misses during read-locks in
        RemoteRepository. (Robert Collins, Andrew Bennetts)

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
    repository,
37
37
    smart,
38
38
    tests,
 
39
    treebuilder,
39
40
    urlutils,
40
41
    )
41
42
from bzrlib.branch import Branch
1577
1578
        self.assertEqual({r1: (NULL_REVISION,)}, parents)
1578
1579
        self.assertEqual(
1579
1580
            [('call_with_body_bytes_expecting_body',
1580
 
              'Repository.get_parent_map', ('quack/', r2), '\n\n0')],
 
1581
              'Repository.get_parent_map', ('quack/', 'include-missing:', r2),
 
1582
              '\n\n0')],
1581
1583
            client._calls)
1582
1584
        repo.unlock()
1583
1585
        # now we call again, and it should use the second response.
1587
1589
        self.assertEqual({r1: (NULL_REVISION,)}, parents)
1588
1590
        self.assertEqual(
1589
1591
            [('call_with_body_bytes_expecting_body',
1590
 
              'Repository.get_parent_map', ('quack/', r2), '\n\n0'),
 
1592
              'Repository.get_parent_map', ('quack/', 'include-missing:', r2),
 
1593
              '\n\n0'),
1591
1594
             ('call_with_body_bytes_expecting_body',
1592
 
              'Repository.get_parent_map', ('quack/', r1), '\n\n0'),
 
1595
              'Repository.get_parent_map', ('quack/', 'include-missing:', r1),
 
1596
              '\n\n0'),
1593
1597
            ],
1594
1598
            client._calls)
1595
1599
        repo.unlock()
1604
1608
        parents = repo.get_parent_map([rev_id])
1605
1609
        self.assertEqual(
1606
1610
            [('call_with_body_bytes_expecting_body',
1607
 
              'Repository.get_parent_map', ('quack/', rev_id), '\n\n0'),
 
1611
              'Repository.get_parent_map', ('quack/', 'include-missing:',
 
1612
              rev_id), '\n\n0'),
1608
1613
             ('disconnect medium',),
1609
1614
             ('call_expecting_body', 'Repository.get_revision_graph',
1610
1615
              ('quack/', ''))],
1643
1648
            errors.UnexpectedSmartServerResponse,
1644
1649
            repo.get_parent_map, ['a-revision-id'])
1645
1650
 
 
1651
    def test_get_parent_map_negative_caches_missing_keys(self):
 
1652
        self.setup_smart_server_with_call_log()
 
1653
        repo = self.make_repository('foo')
 
1654
        self.assertIsInstance(repo, RemoteRepository)
 
1655
        repo.lock_read()
 
1656
        self.addCleanup(repo.unlock)
 
1657
        self.reset_smart_call_log()
 
1658
        graph = repo.get_graph()
 
1659
        self.assertEqual({},
 
1660
            graph.get_parent_map(['some-missing', 'other-missing']))
 
1661
        self.assertLength(1, self.hpss_calls)
 
1662
        # No call if we repeat this
 
1663
        self.reset_smart_call_log()
 
1664
        graph = repo.get_graph()
 
1665
        self.assertEqual({},
 
1666
            graph.get_parent_map(['some-missing', 'other-missing']))
 
1667
        self.assertLength(0, self.hpss_calls)
 
1668
        # Asking for more unknown keys makes a request.
 
1669
        self.reset_smart_call_log()
 
1670
        graph = repo.get_graph()
 
1671
        self.assertEqual({},
 
1672
            graph.get_parent_map(['some-missing', 'other-missing',
 
1673
                'more-missing']))
 
1674
        self.assertLength(1, self.hpss_calls)
 
1675
 
 
1676
    def test_get_parent_map_gets_ghosts_from_result(self):
 
1677
        # asking for a revision should negatively cache close ghosts in its
 
1678
        # ancestry.
 
1679
        self.setup_smart_server_with_call_log()
 
1680
        tree = self.make_branch_and_memory_tree('foo')
 
1681
        tree.lock_write()
 
1682
        try:
 
1683
            builder = treebuilder.TreeBuilder()
 
1684
            builder.start_tree(tree)
 
1685
            builder.build([])
 
1686
            builder.finish_tree()
 
1687
            tree.set_parent_ids(['non-existant'], allow_leftmost_as_ghost=True)
 
1688
            rev_id = tree.commit('')
 
1689
        finally:
 
1690
            tree.unlock()
 
1691
        tree.lock_read()
 
1692
        self.addCleanup(tree.unlock)
 
1693
        repo = tree.branch.repository
 
1694
        self.assertIsInstance(repo, RemoteRepository)
 
1695
        # ask for rev_id
 
1696
        repo.get_parent_map([rev_id])
 
1697
        self.reset_smart_call_log()
 
1698
        # Now asking for rev_id's ghost parent should not make calls
 
1699
        self.assertEqual({}, repo.get_parent_map(['non-existant']))
 
1700
        self.assertLength(0, self.hpss_calls)
 
1701
 
1646
1702
 
1647
1703
class TestGetParentMapAllowsNew(tests.TestCaseWithTransport):
1648
1704
 
2363
2419
        rev_ord, expected_revs = self.get_ordered_revs('knit', 'topological')
2364
2420
        self.assertEqual(expected_revs, rev_ord)
2365
2421
        # Getting topological sort requires VFS calls still
2366
 
        self.assertLength(14, self.hpss_calls)
 
2422
        self.assertLength(12, self.hpss_calls)
2367
2423
 
2368
2424
    def test_stacked_get_stream_groupcompress(self):
2369
2425
        # Repository._get_source.get_stream() from a stacked repository with