Rev 6159: get rid of the default timeout parameters. in http://bazaar.launchpad.net/~jameinel/bzr/drop-idle-connections-824797

John Arbash Meinel john at arbash-meinel.com
Thu Sep 15 12:20:53 UTC 2011


At http://bazaar.launchpad.net/~jameinel/bzr/drop-idle-connections-824797

------------------------------------------------------------
revno: 6159
revision-id: john at arbash-meinel.com-20110915122038-t2ie67bper9mvoy5
parent: john at arbash-meinel.com-20110915120611-41tovapwsa62bz3u
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: drop-idle-connections-824797
timestamp: Thu 2011-09-15 14:20:38 +0200
message:
  get rid of the default timeout parameters.
  
  instead require the timeout parameter to be supplied. This is
  supplied naturally as part of 'bzr serve', and just needs
  some test suite helpers to make it happen.
-------------- next part --------------
=== modified file 'bzrlib/smart/medium.py'
--- a/bzrlib/smart/medium.py	2011-09-15 09:50:23 +0000
+++ b/bzrlib/smart/medium.py	2011-09-15 12:20:38 +0000
@@ -204,9 +204,6 @@
         the stream.  See also the _push_back method.
     """
 
-    _DEFAULT_CLIENT_TIMEOUT = float(config.option_registry.get(
-        'serve.client_timeout').default)
-
     def __init__(self, backing_transport, root_client_path='/', timeout=None):
         """Construct new server.
 
@@ -217,7 +214,7 @@
         self.root_client_path = root_client_path
         self.finished = False
         if timeout is None:
-            timeout = self._DEFAULT_CLIENT_TIMEOUT
+            raise AssertionError('You must supply a timeout.')
         self._client_timeout = timeout
         self._client_poll_timeout = min(timeout / 10.0, 1.0)
         SmartMedium.__init__(self)

=== modified file 'bzrlib/tests/__init__.py'
--- a/bzrlib/tests/__init__.py	2011-09-15 10:10:11 +0000
+++ b/bzrlib/tests/__init__.py	2011-09-15 12:20:38 +0000
@@ -2733,8 +2733,6 @@
         self.__readonly_server = None
         self.__server = None
         self.reduceLockdirTimeout()
-        self.overrideAttr(medium.SmartServerStreamMedium,
-                          '_DEFAULT_CLIENT_TIMEOUT', 4.0)
 
     def setup_smart_server_with_call_log(self):
         """Sets up a smart server as the transport server with a call log."""

=== modified file 'bzrlib/tests/test_server.py'
--- a/bzrlib/tests/test_server.py	2011-09-15 12:01:21 +0000
+++ b/bzrlib/tests/test_server.py	2011-09-15 12:20:38 +0000
@@ -589,7 +589,8 @@
     def __init__(self, request, client_address, server):
         medium.SmartServerSocketStreamMedium.__init__(
             self, request, server.backing_transport,
-            server.root_client_path)
+            server.root_client_path,
+            timeout=_DEFAULT_TESTING_CLIENT_TIMEOUT)
         request.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
         SocketServer.BaseRequestHandler.__init__(self, request, client_address,
                                                  server)

=== modified file 'bzrlib/tests/test_smart_transport.py'
--- a/bzrlib/tests/test_smart_transport.py	2011-09-15 12:03:23 +0000
+++ b/bzrlib/tests/test_smart_transport.py	2011-09-15 12:20:38 +0000
@@ -633,14 +633,22 @@
         listen_sock.close()
         return server_sock, client_sock
 
+    def create_pipe_medium(self, to_server, from_server, transport,
+                           timeout=4.0):
+        return medium.SmartServerPipeStreamMedium(to_server, from_server,
+            transport, timeout=timeout)
+
+    def create_stream_medium(self, server_sock, transport, timeout=4.0):
+        return medium.SmartServerSocketStreamMedium(server_sock, transport,
+            timeout=timeout)
+
     def test_smart_query_version(self):
         """Feed a canned query version to a server"""
         # wire-to-wire, using the whole stack
         to_server = StringIO('hello\n')
         from_server = StringIO()
         transport = local.LocalTransport(urlutils.local_path_to_url('/'))
-        server = medium.SmartServerPipeStreamMedium(
-            to_server, from_server, transport)
+        server = self.create_pipe_medium(to_server, from_server, transport)
         smart_protocol = protocol.SmartServerRequestProtocolOne(transport,
                 from_server.write)
         server._serve_one_request(smart_protocol)
@@ -652,8 +660,7 @@
         transport.put_bytes('testfile', 'contents\nof\nfile\n')
         to_server = StringIO('get\001./testfile\n')
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(
-            to_server, from_server, transport)
+        server = self.create_pipe_medium(to_server, from_server, transport)
         smart_protocol = protocol.SmartServerRequestProtocolOne(transport,
                 from_server.write)
         server._serve_one_request(smart_protocol)
@@ -672,8 +679,7 @@
         transport.put_bytes(utf8_filename, 'contents\nof\nfile\n')
         to_server = StringIO('get\001' + hpss_path + '\n')
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(
-            to_server, from_server, transport)
+        server = self.create_pipe_medium(to_server, from_server, transport)
         smart_protocol = protocol.SmartServerRequestProtocolOne(transport,
                 from_server.write)
         server._serve_one_request(smart_protocol)
@@ -687,7 +693,7 @@
         sample_request_bytes = 'command\n9\nbulk datadone\n'
         to_server = StringIO(sample_request_bytes)
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(
+        server = self.create_pipe_medium(
             to_server, from_server, None)
         sample_protocol = SampleRequest(expected_bytes=sample_request_bytes)
         server._serve_one_request(sample_protocol)
@@ -698,8 +704,7 @@
     def test_socket_stream_with_bulk_data(self):
         sample_request_bytes = 'command\n9\nbulk datadone\n'
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         sample_protocol = SampleRequest(expected_bytes=sample_request_bytes)
         client_sock.sendall(sample_request_bytes)
         server._serve_one_request(sample_protocol)
@@ -711,15 +716,14 @@
     def test_pipe_like_stream_shutdown_detection(self):
         to_server = StringIO('')
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(to_server, from_server, None)
+        server = self.create_pipe_medium(to_server, from_server, None)
         server._serve_one_request(SampleRequest('x'))
         self.assertTrue(server.finished)
 
     def test_socket_stream_shutdown_detection(self):
         server_sock, client_sock = self.portable_socket_pair()
         client_sock.close()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         server._serve_one_request(SampleRequest('x'))
         self.assertTrue(server.finished)
 
@@ -737,8 +741,7 @@
         expected_response = (
             protocol.RESPONSE_VERSION_TWO + 'success\nok\x012\n')
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         client_sock.sendall(incomplete_request_bytes)
         server_protocol = server._build_protocol()
         client_sock.sendall(rest_of_request_bytes)
@@ -768,7 +771,7 @@
         to_server_w = os.fdopen(to_server_w, 'w', 0)
         from_server_r = os.fdopen(from_server_r, 'r', 0)
         from_server = os.fdopen(from_server, 'w', 0)
-        server = medium.SmartServerPipeStreamMedium(
+        server = self.create_pipe_medium(
             to_server, from_server, None)
         # Like test_socket_stream_incomplete_request, write an incomplete
         # request (that does not end in '\n') and build a protocol from it.
@@ -792,7 +795,7 @@
         sample_request_bytes = 'command\n'
         to_server = StringIO(sample_request_bytes * 2)
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(
+        server = self.create_pipe_medium(
             to_server, from_server, None)
         first_protocol = SampleRequest(expected_bytes=sample_request_bytes)
         server._serve_one_request(first_protocol)
@@ -813,8 +816,7 @@
         # been received separately.
         sample_request_bytes = 'command\n'
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         first_protocol = SampleRequest(expected_bytes=sample_request_bytes)
         # Put two whole requests on the wire.
         client_sock.sendall(sample_request_bytes * 2)
@@ -840,7 +842,7 @@
         def close():
             self.closed = True
         from_server.close = close
-        server = medium.SmartServerPipeStreamMedium(
+        server = self.create_pipe_medium(
             to_server, from_server, None)
         fake_protocol = ErrorRaisingProtocol(Exception('boom'))
         server._serve_one_request(fake_protocol)
@@ -850,8 +852,7 @@
 
     def test_socket_stream_error_handling(self):
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         fake_protocol = ErrorRaisingProtocol(Exception('boom'))
         server._serve_one_request(fake_protocol)
         # recv should not block, because the other end of the socket has been
@@ -862,7 +863,7 @@
     def test_pipe_like_stream_keyboard_interrupt_handling(self):
         to_server = StringIO('')
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(
+        server = self.create_pipe_medium(
             to_server, from_server, None)
         fake_protocol = ErrorRaisingProtocol(KeyboardInterrupt('boom'))
         self.assertRaises(
@@ -871,8 +872,7 @@
 
     def test_socket_stream_keyboard_interrupt_handling(self):
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         fake_protocol = ErrorRaisingProtocol(KeyboardInterrupt('boom'))
         self.assertRaises(
             KeyboardInterrupt, server._serve_one_request, fake_protocol)
@@ -882,14 +882,13 @@
     def build_protocol_pipe_like(self, bytes):
         to_server = StringIO(bytes)
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(
+        server = self.create_pipe_medium(
             to_server, from_server, None)
         return server._build_protocol()
 
     def build_protocol_socket(self, bytes):
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         client_sock.sendall(bytes)
         client_sock.close()
         return server._build_protocol()
@@ -935,33 +934,20 @@
         server_protocol = self.build_protocol_socket('bzr request 2\n')
         self.assertProtocolTwo(server_protocol)
 
-    def test_socket_default_timeout(self):
-        server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(server_sock, None)
-        self.assertEqual(server._DEFAULT_CLIENT_TIMEOUT,
-                         server._client_timeout)
-
     def test_socket_set_timeout(self):
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(server_sock, None,
-            timeout=1.23)
+        server = self.create_stream_medium(server_sock, None, timeout=1.23)
         self.assertEqual(1.23, server._client_timeout)
 
-    def test_pipe_default_timeout(self):
-        server = medium.SmartServerPipeStreamMedium(None, None, None)
-        self.assertEqual(server._DEFAULT_CLIENT_TIMEOUT,
-                         server._client_timeout)
-
     def test_pipe_set_timeout(self):
-        server = medium.SmartServerPipeStreamMedium(None, None, None,
+        server = self.create_pipe_medium(None, None, None,
             timeout=1.23)
         self.assertEqual(1.23, server._client_timeout)
 
     def test_socket_wait_for_bytes_with_timeout_with_data(self):
         server_sock, client_sock = self.portable_socket_pair()
         self.addCleanup(server_sock.close)
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         client_sock.sendall('data\n')
         # This should not block or consume any actual content
         self.assertFalse(server._wait_for_bytes_with_timeout(0.1))
@@ -971,8 +957,7 @@
     def test_socket_wait_for_bytes_with_timeout_no_data(self):
         server_sock, client_sock = self.portable_socket_pair()
         self.addCleanup(server_sock.close)
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         # This should timeout quickly, reporting that there wasn't any data
         self.assertTrue(server._wait_for_bytes_with_timeout(0.01))
         client_sock.close()
@@ -982,8 +967,7 @@
     def test_socket_wait_for_bytes_with_timeout_closed(self):
         server_sock, client_sock = self.portable_socket_pair()
         self.addCleanup(server_sock.close)
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None)
+        server = self.create_stream_medium(server_sock, None)
         # With the socket closed, this should return right away.
         # It seems select.select() returns that you *can* read on the socket,
         # even though it closed. Presumably as a way to tell it is closed?
@@ -996,8 +980,7 @@
 
     def test_socket_serve_timeout_closes_socket(self):
         server_sock, client_sock = self.portable_socket_pair()
-        server = medium.SmartServerSocketStreamMedium(
-            server_sock, None, timeout=0.1)
+        server = self.create_stream_medium(server_sock, None, timeout=0.1)
         # This should timeout quickly, and then close the connection so that
         # client_sock recv doesn't block.
         server.serve()
@@ -1009,7 +992,7 @@
         (r_server, w_client) = os.pipe()
         self.addCleanup(os.close, w_client)
         with os.fdopen(r_server, 'rb') as rf_server:
-            server = medium.SmartServerPipeStreamMedium(
+            server = self.create_pipe_medium(
                 rf_server, None, None)
             os.write(w_client, 'data\n')
             # This should not block or consume any actual content
@@ -1024,7 +1007,7 @@
         # We can't add an os.close cleanup here, because we need to control
         # when the file handle gets closed ourselves.
         with os.fdopen(r_server, 'rb') as rf_server:
-            server = medium.SmartServerPipeStreamMedium(
+            server = self.create_pipe_medium(
                 rf_server, None, None)
             if sys.platform == 'win32':
                 # Windows cannot select() on a pipe, so we just always return
@@ -1039,7 +1022,7 @@
     def test_pipe_wait_for_bytes_no_fileno(self):
         to_server = StringIO('')
         from_server = StringIO()
-        server = medium.SmartServerPipeStreamMedium(
+        server = self.create_pipe_medium(
             to_server, from_server, None)
         # Our file doesn't support polling, so we should always just return
         # 'you have data to consume.
@@ -1103,12 +1086,6 @@
                                 t.get, 'something')
         self.assertContainsRe(str(err), 'some random exception')
 
-    def test_default_timeout(self):
-        server = _mod_server.SmartTCPServer(None)
-        server_socket = socket.socket()
-        handler = server._make_handler(server_socket)
-        self.assertEqual(handler._DEFAULT_CLIENT_TIMEOUT, handler._client_timeout)
-
     def test_propagates_timeout(self):
         server = _mod_server.SmartTCPServer(None, client_timeout=1.23)
         server_socket = socket.socket()
@@ -1146,7 +1123,8 @@
             self.real_backing_transport = self.backing_transport
             self.backing_transport = _mod_transport.get_transport_from_url(
                 "readonly+" + self.backing_transport.abspath('.'))
-        self.server = _mod_server.SmartTCPServer(self.backing_transport)
+        self.server = _mod_server.SmartTCPServer(self.backing_transport,
+                                                 client_timeout=4.0)
         self.server.start_server('127.0.0.1', 0)
         self.server.start_background_thread('-' + self.id())
         self.transport = remote.RemoteTCPTransport(self.server.get_url())
@@ -2668,7 +2646,7 @@
         from_server = StringIO()
         transport = memory.MemoryTransport('memory:///')
         server = medium.SmartServerPipeStreamMedium(
-            to_server, from_server, transport)
+            to_server, from_server, transport, timeout=4.0)
         proto = server._build_protocol()
         message_handler = proto.message_handler
         server._serve_one_request(proto)



More information about the bazaar-commits mailing list