At http://people.ubuntu.com/~robertc/baz2.0/push.roundtrips
------------------------------------------------------------ revno: 4047 revision-id: [email protected] parent: [email protected] committer: Robert Collins <[email protected]> branch nick: push.roundtrips timestamp: Wed 2009-02-25 15:28:42 +1100 message: Create a one-shot cache of the result of RemoteBzrDir.create_branch, eliminating 3 round trips for nonstacked branches and 5 for stacked. === modified file 'bzrlib/remote.py' --- a/bzrlib/remote.py 2009-02-25 00:31:09 +0000 +++ b/bzrlib/remote.py 2009-02-25 04:28:42 +0000 @@ -96,6 +96,9 @@ # this object holds a delegated bzrdir that uses file-level operations # to talk to the other side self._real_bzrdir = None + # 1-shot cache for the call pattern 'create_branch; open_branch' - see + # create_branch for details. + self._next_open_branch_result = None if _client is None: medium = transport.get_smart_medium() @@ -123,6 +126,12 @@ def _translate_error(self, err, **context): _translate_error(err, bzrdir=self, **context) + def break_lock(self): + # Prevent aliasing problems in the next_open_branch_result cache. + # See create_branch for rationale. + self._next_open_branch_result = None + return BzrDir.break_lock(self) + def cloning_metadir(self, stacked=False): self._ensure_real() return self._real_bzrdir.cloning_metadir(stacked) @@ -146,14 +155,23 @@ # be parameterised. real_branch = self._format.get_branch_format().initialize(self) if not isinstance(real_branch, RemoteBranch): - return RemoteBranch(self, self.find_repository(), real_branch) + result = RemoteBranch(self, self.find_repository(), real_branch) else: - return real_branch + result = real_branch + # BzrDir.clone_on_transport() uses the result of create_branch but does + # not return it to its callers; we save approximately 8% of our round + # trips by handing the branch we created back to the first caller to + # open_branch rather than probing anew. Long term we need a API in + # bzrdir that doesn't discard result objects (like result_branch). + # RBC 20090225 + self._next_open_branch_result = result + return result def destroy_branch(self): """See BzrDir.destroy_branch""" self._ensure_real() self._real_bzrdir.destroy_branch() + self._next_open_branch_result = None def create_workingtree(self, revision_id=None, from_branch=None): raise errors.NotLocalUrl(self.transport.base) @@ -187,6 +205,11 @@ def open_branch(self, _unsupported=False): if _unsupported: raise NotImplementedError('unsupported flag support not implemented yet.') + if self._next_open_branch_result is not None: + # See create_branch for details. + result = self._next_open_branch_result + self._next_open_branch_result = None + return result reference_url = self.get_branch_reference() if reference_url is None: # branch at this location. === modified file 'bzrlib/tests/blackbox/test_push.py' --- a/bzrlib/tests/blackbox/test_push.py 2009-02-24 21:22:43 +0000 +++ b/bzrlib/tests/blackbox/test_push.py 2009-02-25 04:28:42 +0000 @@ -202,7 +202,7 @@ # being too low. If rpc_count increases, more network roundtrips have # become necessary for this use case. Please do not adjust this number # upwards without agreement from bzr's network support maintainers. - self.assertEqual(32, rpc_count) + self.assertEqual(29, rpc_count) def test_push_smart_stacked_streaming_acceptance(self): self.setup_smart_server_with_call_log() @@ -219,7 +219,7 @@ # being too low. If rpc_count increases, more network roundtrips have # become necessary for this use case. Please do not adjust this number # upwards without agreement from bzr's network support maintainers. - self.assertEqual(61, rpc_count) + self.assertEqual(56, rpc_count) remote = Branch.open('public') self.assertEndsWith(remote.get_stacked_on_url(), '/parent') -- bazaar-commits mailing list [email protected] https://lists.ubuntu.com/mailman/listinfo/bazaar-commits
