]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Synchronize chunk size between HTTP1Connection and IOStream.
authorBen Darnell <ben@bendarnell.com>
Sun, 20 Apr 2014 14:28:23 +0000 (10:28 -0400)
committerBen Darnell <ben@bendarnell.com>
Sun, 20 Apr 2014 18:53:00 +0000 (14:53 -0400)
Increase IOStream default chunk size to 64KB.

tornado/httpserver.py
tornado/iostream.py
tornado/tcpserver.py

index 995ab7b104e0b6a42ee1c53512e809a93cf693e8..556b891e1d8692500112ff91884e00ae2fd9ecc0 100644 (file)
@@ -148,7 +148,8 @@ class HTTPServer(TCPServer, httputil.HTTPServerConnectionDelegate):
         self.body_timeout = body_timeout
         self.max_body_size = max_body_size
         TCPServer.__init__(self, io_loop=io_loop, ssl_options=ssl_options,
-                           max_buffer_size=max_buffer_size)
+                           max_buffer_size=max_buffer_size,
+                           read_chunk_size=chunk_size)
 
     def handle_stream(self, stream, address):
         conn = HTTP1Connection(
index 386c55e9bdea1de1f1f7acce788841473613069e..489417834ee31a50c4a2e38ebea819f228735f73 100644 (file)
@@ -90,10 +90,13 @@ class BaseIOStream(object):
     `read_from_fd`, and optionally `get_fd_error`.
     """
     def __init__(self, io_loop=None, max_buffer_size=None,
-                 read_chunk_size=4096):
+                 read_chunk_size=None):
         self.io_loop = io_loop or ioloop.IOLoop.current()
         self.max_buffer_size = max_buffer_size or 104857600
-        self.read_chunk_size = read_chunk_size
+        # A chunk size that is too close to max_buffer_size can cause
+        # spurious failures.
+        self.read_chunk_size = min(read_chunk_size or 65536,
+                                   self.max_buffer_size//2)
         self.error = None
         self._read_buffer = collections.deque()
         self._write_buffer = collections.deque()
@@ -583,7 +586,7 @@ class BaseIOStream(object):
             return 0
         self._read_buffer.append(chunk)
         self._read_buffer_size += len(chunk)
-        if self._read_buffer_size >= self.max_buffer_size:
+        if self._read_buffer_size > self.max_buffer_size:
             gen_log.error("Reached maximum read buffer size")
             self.close()
             raise IOError("Reached maximum read buffer size")
index c07737329c785e7876d0e0ead7a81425a365b79b..456e37ed3da4878c4e8ac00475281ecb5b2de645 100644 (file)
@@ -81,13 +81,15 @@ class TCPServer(object):
     .. versionadded:: 3.1
        The ``max_buffer_size`` argument.
     """
-    def __init__(self, io_loop=None, ssl_options=None, max_buffer_size=None):
+    def __init__(self, io_loop=None, ssl_options=None, max_buffer_size=None,
+                 read_chunk_size=None):
         self.io_loop = io_loop
         self.ssl_options = ssl_options
         self._sockets = {}  # fd -> socket object
         self._pending_sockets = []
         self._started = False
         self.max_buffer_size = max_buffer_size
+        self.read_chunk_size = None
 
         # Verify the SSL options. Otherwise we don't get errors until clients
         # connect. This doesn't verify that the keys are legitimate, but
@@ -237,9 +239,13 @@ class TCPServer(object):
                     raise
         try:
             if self.ssl_options is not None:
-                stream = SSLIOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size)
+                stream = SSLIOStream(connection, io_loop=self.io_loop,
+                                     max_buffer_size=self.max_buffer_size,
+                                     read_chunk_size=self.read_chunk_size)
             else:
-                stream = IOStream(connection, io_loop=self.io_loop, max_buffer_size=self.max_buffer_size)
+                stream = IOStream(connection, io_loop=self.io_loop,
+                                  max_buffer_size=self.max_buffer_size,
+                                  read_chunk_size=self.read_chunk_size)
             self.handle_stream(stream, address)
         except Exception:
             app_log.error("Error in connection callback", exc_info=True)