From d00d6df7895ed648eedfa567e60919a910bbe192 Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Tue, 12 Apr 2011 23:50:20 -0700 Subject: [PATCH] Timeouts get porpagated out of tpool.execute. --- NEWS | 5 +++-- eventlet/tpool.py | 9 ++++++--- tests/tpool_test.py | 6 ++++++ 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 357e6af..1abc8cd 100644 --- a/NEWS +++ b/NEWS @@ -2,11 +2,12 @@ ====== * ZeroMQ support without an explicit hub now implemented! Thanks to Zed Shaw for the patch. * zmq module supports the NOBLOCK flag, thanks to rfk. (#76) -* eventlet.wsgi has a debug flag which can be set to false to not send tracebacks to the client -* Recursive GreenPipe madeness forestalled by Soren Hansen (#77) +* eventlet.wsgi has a debug flag which can be set to false to not send tracebacks to the client (per redbo's request) +* Recursive GreenPipe madness forestalled by Soren Hansen (#77) * eventlet.green.ssl no longer busywaits on send() * EEXIST ignored in epoll hub (#80) * eventlet.listen's behavior on Windows improved, thanks to Nick Vatamaniuc (#83) +* Timeouts raised within tpool.execute are propagated back to the caller (thanks again to redbo for being the squeaky wheel) 0.9.14 ====== diff --git a/eventlet/tpool.py b/eventlet/tpool.py index a54f894..e8b53f3 100644 --- a/eventlet/tpool.py +++ b/eventlet/tpool.py @@ -21,6 +21,7 @@ from eventlet import event from eventlet import greenio from eventlet import greenthread from eventlet import patcher +from eventlet import timeout threading = patcher.original('threading') Queue_module = patcher.original('Queue') Queue = Queue_module.Queue @@ -58,7 +59,7 @@ def tpool_trampoline(): SYS_EXCS = (KeyboardInterrupt, SystemExit) - +EXC_CLASSES = (Exception, timeout.Timeout) def tworker(reqq): global _rspq @@ -75,7 +76,7 @@ def tworker(reqq): rv = meth(*args,**kwargs) except SYS_EXCS: raise - except Exception: + except EXC_CLASSES: rv = sys.exc_info() # test_leakage_from_tracebacks verifies that the use of # exc_info does not lead to memory leaks @@ -116,7 +117,9 @@ def execute(meth,*args, **kwargs): reqq.put((e,meth,args,kwargs)) rv = e.wait() - if isinstance(rv,tuple) and len(rv) == 3 and isinstance(rv[1],Exception): + if isinstance(rv,tuple) \ + and len(rv) == 3 \ + and isinstance(rv[1],EXC_CLASSES): import traceback (c,e,tb) = rv if not QUIET: diff --git a/tests/tpool_test.py b/tests/tpool_test.py index d88f238..994020b 100644 --- a/tests/tpool_test.py +++ b/tests/tpool_test.py @@ -269,6 +269,12 @@ class TestTpool(LimitedTestCase): x = tpool.Proxy(wrapped, autowrap_names=('__call__',)) for r in x(3): self.assertEquals(3, r) + + @skip_with_pyevent + def test_eventlet_timeout(self): + def raise_timeout(): + raise eventlet.Timeout() + self.assertRaises(eventlet.Timeout, tpool.execute, raise_timeout) class TpoolLongTests(LimitedTestCase): TEST_TIMEOUT=60