From 14aeab220199befd335d9e23affb116fa6850e32 Mon Sep 17 00:00:00 2001 From: Guido Trotter <ultrotter@google.com> Date: Mon, 31 May 2010 11:36:14 +0200 Subject: [PATCH] Fix IgnoreSignals on socket.error Some confusion arose handling EINTR on this function: in python 2.6 socket.error is an IOError, and thus: - It's an EnvironmentError - It has an .errno member In 2.4 and 2.5 it's not, and so its errno variable must be extracted from the args tuple. This patch fixes both the function, and the unittests. This is a cherry-pick of master commit 965d0e5ba37f3e88aa38230177ad1c66814bf927 with the portions not relevant to 2.1 removed (changes to the RetryOnSignals function). Signed-off-by: Guido Trotter <ultrotter@google.com> Reviewed-by: Iustin Pop <iustin@google.com> --- lib/utils.py | 6 ++++-- test/ganeti.utils_unittest.py | 2 -- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/utils.py b/lib/utils.py index e3dd43564..2909f8664 100644 --- a/lib/utils.py +++ b/lib/utils.py @@ -2518,10 +2518,12 @@ def IgnoreSignals(fn, *args, **kwargs): """ try: return fn(*args, **kwargs) - except (EnvironmentError, socket.error), err: + except EnvironmentError, err: if err.errno != errno.EINTR: raise - except select.error, err: + except (select.error, socket.error), err: + # In python 2.6 and above select.error is an IOError, so it's handled + # above, in 2.5 and below it's not, and it's handled here. if not (err.args and err.args[0] == errno.EINTR): raise diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py index 548d04eed..a78115f07 100755 --- a/test/ganeti.utils_unittest.py +++ b/test/ganeti.utils_unittest.py @@ -1836,9 +1836,7 @@ class TestIgnoreSignals(unittest.TestCase): def testIgnoreSignals(self): sock_err_intr = socket.error(errno.EINTR, "Message") - sock_err_intr.errno = errno.EINTR sock_err_inval = socket.error(errno.EINVAL, "Message") - sock_err_inval.errno = errno.EINVAL env_err_intr = EnvironmentError(errno.EINTR, "Message") env_err_inval = EnvironmentError(errno.EINVAL, "Message") -- GitLab