self.queue.append((key, request, callback))
if not len(self.active) < self.max_clients:
timeout_handle = self.io_loop.add_timeout(
- request.start_time + min(request.connect_timeout, request.request_timeout),
+ self.io_loop.time() + min(request.connect_timeout,
+ request.request_timeout),
functools.partial(self._on_timeout, key))
- self.waiting[key] = (request, callback, timeout_handle)
+ else:
+ timeout_handle = None
+ self.waiting[key] = (request, callback, timeout_handle)
self._process_queue()
if self.queue:
gen_log.debug("max_clients limit reached, request queued. "
with stack_context.NullContext():
while self.queue and len(self.active) < self.max_clients:
key, request, callback = self.queue.popleft()
+ if key not in self.waiting:
+ continue
self._remove_timeout(key)
self.active[key] = (request, callback)
release_callback = functools.partial(self._release_fetch, key)
def _remove_timeout(self, key):
if key in self.waiting:
request, callback, timeout_handle = self.waiting[key]
- self.io_loop.remove_timeout(timeout_handle)
+ if timeout_handle is not None:
+ self.io_loop.remove_timeout(timeout_handle)
del self.waiting[key]
def _on_timeout(self, key):
self.assertTrue(expected_message in str(response.error),
response.error)
+ def test_queue_timeout(self):
+ with closing(self.create_client(max_clients=1)) as client:
+ client.fetch(self.get_url('/trigger'), self.stop,
+ request_timeout=10)
+ # Wait for the trigger request to block, not complete.
+ self.wait()
+ client.fetch(self.get_url('/hello'), self.stop,
+ connect_timeout=0.1)
+ response = self.wait()
+
+ self.assertEqual(response.code, 599)
+ self.assertTrue(response.request_time < 1, response.request_time)
+ self.assertEqual(str(response.error), "HTTP 599: Timeout")
+ self.triggers.popleft()()
+ self.wait()
+
class SimpleHTTPClientTestCase(SimpleHTTPClientTestMixin, AsyncHTTPTestCase):
def setUp(self):
response = self.wait()
response.rethrow()
self.assertEqual(response.body, b'Hello world!')
-
-
-class HeavyloadAsyncHTTPClientTestCase(SimpleHTTPClientTestMixin, AsyncHTTPTestCase):
- def create_client(self, **kwargs):
- return SimpleAsyncHTTPClient(self.io_loop, force_instance=True, **kwargs)
-
- def test_heavyload_timeout(self):
- with closing(self.create_client(max_clients=1)) as client:
- client.fetch(self.get_url('/trigger?wake=false'), self.stop, request_timeout=10)
- client.fetch(self.get_url('/hello'), self.stop, connect_timeout=3)
- response = self.wait()
-
- self.assertEqual(response.code, 599)
- self.assertTrue(2.9 < response.request_time < 3.1, response.request_time)
- self.assertEqual(str(response.error), "HTTP 599: Timeout")
- self.triggers.popleft()()
-
-