Rev 4902: I've started passing around too many parameters to too many functions. in http://bazaar.launchpad.net/~jameinel/bzr/2.1-client-read-reconnect-819604
John Arbash Meinel
john at arbash-meinel.com
Fri Oct 7 18:40:45 UTC 2011
At http://bazaar.launchpad.net/~jameinel/bzr/2.1-client-read-reconnect-819604
------------------------------------------------------------
revno: 4902
revision-id: john at arbash-meinel.com-20111007184018-klup501y7ncps2k8
parent: john at arbash-meinel.com-20111007121231-v1oo7htubsh9qiro
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: 2.1-client-read-reconnect-819604
timestamp: Fri 2011-10-07 20:40:18 +0200
message:
I've started passing around too many parameters to too many functions.
Encapsulate the state into a Request class.
-------------- next part --------------
=== modified file 'bzrlib/smart/client.py'
--- a/bzrlib/smart/client.py 2011-10-07 12:12:31 +0000
+++ b/bzrlib/smart/client.py 2011-10-07 18:40:18 +0000
@@ -97,46 +97,44 @@
for hook in _SmartClient.hooks['call']:
hook(params)
+ def _determine_protocol_version(self, method, args, body=None,
+ readv_body=None, body_stream=None, expect_response_body=True):
+ for protocol_version in [3, 2]:
+ if protocol_version == 2:
+ # If v3 doesn't work, the remote side is older than 1.6.
+ self._medium._remember_remote_is_before((1, 6))
+ response_handler = self._send_request(
+ protocol_version, method, args, body=body,
+ readv_body=readv_body, body_stream=body_stream)
+ try:
+ response_tuple = response_handler.read_response_tuple(
+ expect_body=expect_response_body)
+ except errors.UnexpectedProtocolVersionMarker, err:
+ # TODO: We could recover from this without disconnecting if
+ # we recognise the protocol version.
+ warning(
+ 'Server does not understand Bazaar network protocol %d,'
+ ' reconnecting. (Upgrade the server to avoid this.)'
+ % (protocol_version,))
+ self._medium.disconnect()
+ continue
+ except errors.ErrorFromSmartServer:
+ # If we received an error reply from the server, then it
+ # must be ok with this protocol version.
+ self._medium._protocol_version = protocol_version
+ raise
+ else:
+ self._medium._protocol_version = protocol_version
+ return response_tuple, response_handler
+ raise errors.SmartProtocolError(
+ 'Server is not a Bazaar server: ' + str(err))
+
def _call_and_read_response(self, method, args, body=None, readv_body=None,
body_stream=None, expect_response_body=True):
- self._run_call_hooks(method, args, body, readv_body)
- if self._medium._protocol_version is not None:
- response_handler = self._send_request(
- self._medium._protocol_version, method, args, body=body,
- readv_body=readv_body, body_stream=body_stream)
- return (response_handler.read_response_tuple(
- expect_body=expect_response_body),
- response_handler)
- else:
- for protocol_version in [3, 2]:
- if protocol_version == 2:
- # If v3 doesn't work, the remote side is older than 1.6.
- self._medium._remember_remote_is_before((1, 6))
- response_handler = self._send_request(
- protocol_version, method, args, body=body,
- readv_body=readv_body, body_stream=body_stream)
- try:
- response_tuple = response_handler.read_response_tuple(
- expect_body=expect_response_body)
- except errors.UnexpectedProtocolVersionMarker, err:
- # TODO: We could recover from this without disconnecting if
- # we recognise the protocol version.
- warning(
- 'Server does not understand Bazaar network protocol %d,'
- ' reconnecting. (Upgrade the server to avoid this.)'
- % (protocol_version,))
- self._medium.disconnect()
- continue
- except errors.ErrorFromSmartServer:
- # If we received an error reply from the server, then it
- # must be ok with this protocol version.
- self._medium._protocol_version = protocol_version
- raise
- else:
- self._medium._protocol_version = protocol_version
- return response_tuple, response_handler
- raise errors.SmartProtocolError(
- 'Server is not a Bazaar server: ' + str(err))
+ request = _SmartClientRequest(self, method, args, body=body,
+ readv_body=readv_body, body_stream=body_stream,
+ expect_response_body=expect_response_body)
+ return request.call_and_read_response()
def _construct_protocol(self, version):
request = self._medium.get_request()
@@ -218,6 +216,68 @@
return self._medium.remote_path_from_transport(transport)
+class _SmartClientRequest(object):
+ """Encapsulate the logic for a single request."""
+
+ def __init__(self, client, method, args, body=None, readv_body=None,
+ body_stream=None, expect_response_body=True):
+ self.client = client
+ self.method = method
+ self.args = args
+ self.body = body
+ self.readv_body = readv_body
+ self.body_stream = body_stream
+ self.expect_response_body = expect_response_body
+
+ def call_and_read_response(self):
+ self.client._run_call_hooks(self.method, self.args, self.body,
+ self.readv_body)
+ if self.client._medium._protocol_version is None:
+ return self._call_determining_protocol_version()
+ else:
+ return self._call()
+
+ def _call(self):
+ response_handler = self.client._send_request(
+ self.client._medium._protocol_version, self.method, self.args,
+ body=self.body, readv_body=self.readv_body,
+ body_stream=self.body_stream)
+ response_tuple = response_handler.read_response_tuple(
+ expect_body=self.expect_response_body)
+ return (response_tuple, response_handler)
+
+ def _call_determining_protocol_version(self):
+ for protocol_version in [3, 2]:
+ if protocol_version == 2:
+ # If v3 doesn't work, the remote side is older than 1.6.
+ self.client._medium._remember_remote_is_before((1, 6))
+ response_handler = self.client._send_request(
+ protocol_version, self.method, self.args, body=self.body,
+ readv_body=self.readv_body, body_stream=self.body_stream)
+ try:
+ response_tuple = response_handler.read_response_tuple(
+ expect_body=self.expect_response_body)
+ except errors.UnexpectedProtocolVersionMarker, err:
+ # TODO: We could recover from this without disconnecting if
+ # we recognise the protocol version.
+ warning(
+ 'Server does not understand Bazaar network protocol %d,'
+ ' reconnecting. (Upgrade the server to avoid this.)'
+ % (protocol_version,))
+ self.client._medium.disconnect()
+ continue
+ except errors.ErrorFromSmartServer:
+ # If we received an error reply from the server, then it
+ # must be ok with this protocol version.
+ self.client._medium._protocol_version = protocol_version
+ raise
+ else:
+ self.client._medium._protocol_version = protocol_version
+ return response_tuple, response_handler
+ raise errors.SmartProtocolError(
+ 'Server is not a Bazaar server: ' + str(err))
+
+
class SmartClientHooks(hooks.Hooks):
def __init__(self):
More information about the bazaar-commits
mailing list