[ 
https://issues.apache.org/jira/browse/QPID-2294?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13872259#comment-13872259
 ] 

Gordon Sim commented on QPID-2294:
----------------------------------

This is easy to reproduce in any qpid.messaging based application that handles 
signals.

Suggested fix:
{noformat}
diff --git a/qpid/python/qpid/compat.py b/qpid/python/qpid/compat.py
index 8b1f4b7..37c5bed 100644
--- a/qpid/python/qpid/compat.py
+++ b/qpid/python/qpid/compat.py
@@ -42,6 +42,7 @@ if tuple(sys.version_info[0:2]) < (2, 4):
     return old_select(list(rlist), list(wlist), list(xlist), timeout)
 else:
   from select import select
+  from select import error as SelectError
 
 class BaseWaiter:
 
@@ -50,7 +51,11 @@ class BaseWaiter:
 
   def wait(self, timeout=None):
     if timeout is not None:
-      ready, _, _ = select([self], [], [], timeout)
+      while True:
+        try:
+          ready, _, _ = select([self], [], [], timeout)
+          break
+        except SelectError: None
     else:
       ready = True
{noformat}

> The Unix python client can erroneously throw exceptions from select due to 
> interrupted system call
> --------------------------------------------------------------------------------------------------
>
>                 Key: QPID-2294
>                 URL: https://issues.apache.org/jira/browse/QPID-2294
>             Project: Qpid
>          Issue Type: Bug
>          Components: Python Client
>    Affects Versions: 0.6
>         Environment: Red Hat Enterprise Linux 5.4
>            Reporter: Andrew Stitcher
>            Assignee: Rafael H. Schloming
>
> When running autotools "make check"
> You can cause the python_tests to fail in the qpid.tests.messaging section 
> (and perhaps elsewhere) by resizing the window that is running the tests.
> You get something like this:
> qpid.tests.messaging.SenderTests.testSendAsyncCapacityUNLIMITED 
> ............................ fail
> Error during test:
>   Traceback (most recent call last):
>     File 
> "/home/astitche/bld-working/src/tests/python/commands/qpid-python-test", line 
> 307, in run
>       phase()
>     File 
> "/home/astitche/bld-working/src/tests/python/qpid/tests/messaging.py", line 
> 796, in testSendAsyncCapacityUNLIMITED
>       self.asyncTest(UNLIMITED)
>     File 
> "/home/astitche/bld-working/src/tests/python/qpid/tests/messaging.py", line 
> 777, in asyncTest
>       drained = self.drain(self.rcv, timeout=self.delay())
>     File 
> "/home/astitche/bld-working/src/tests/python/qpid/tests/messaging.py", line 
> 84, in drain
>       contents.append(rcv.fetch(timeout=timeout).content)
>     File "<string>", line 6, in fetch
>     File "/home/astitche/bld-working/src/tests/python/qpid/messaging.py", 
> line 668, in fetch
>       msg = self.session._get(self._pred, timeout=timeout)
>     File "<string>", line 6, in _get
>     File "/home/astitche/bld-working/src/tests/python/qpid/messaging.py", 
> line 360, in _get
>       timeout):
>     File "/home/astitche/bld-working/src/tests/python/qpid/messaging.py", 
> line 294, in _ewait
>       result = self.connection._ewait(lambda: self.error or predicate(), 
> timeout, exc)
>     File "/home/astitche/bld-working/src/tests/python/qpid/messaging.py", 
> line 142, in _ewait
>       result = self._wait(lambda: self.error or predicate(), timeout)
>     File "/home/astitche/bld-working/src/tests/python/qpid/messaging.py", 
> line 131, in _wait
>       return self._waiter.wait(predicate, timeout=timeout)
>     File "/home/astitche/bld-working/src/tests/python/qpid/concurrency.py", 
> line 59, in wait
>       self.condition.wait(timeout - passed)
>     File "/home/astitche/bld-working/src/tests/python/qpid/concurrency.py", 
> line 96, in wait
>       sw.wait(timeout)
>     File "/home/astitche/bld-working/src/tests/python/qpid/compat.py", line 
> 53, in wait
>       ready, _, _ = select([self], [], [], timeout)
>   error: (4, 'Interrupted system call')
> The cause is that python is receiving the SIGWINCH signal from the window 
> size change and this is interrupting the select system call. The exception 
> that is being thrown by select is not being caught.
> This needs to be fixed as interrupted system calls are a fact of life when 
> running on Unix - you could argue that the python run time should just 
> restart the select, but it isn't doing that here.
> Note that allowing for interrupted system calls screws up the timeout 
> calculation. As you'll need to figure out how much of the wait is left and 
> then wait for less time when restarting the system call.



--
This message was sent by Atlassian JIRA
(v6.1.5#6160)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@qpid.apache.org
For additional commands, e-mail: dev-h...@qpid.apache.org

Reply via email to