From 8ab5ef283df66ef99aa0c826d941e414407bf773 Mon Sep 17 00:00:00 2001 From: Avery Pennarun Date: Sun, 29 May 2011 22:04:39 -0400 Subject: [PATCH] ssnet.py: deal with a possible connect/getsockopt(SO_ERROR) race. Seems to affect Linux servers. Ed Maste says the patch fixes it for him. --- ssnet.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/ssnet.py b/ssnet.py index b6d73c2..a636ce1 100644 --- a/ssnet.py +++ b/ssnet.py @@ -152,6 +152,17 @@ def try_connect(self): debug3('%r: fixed connect result: %s\n' % (self, e)) if e.args[0] in [errno.EINPROGRESS, errno.EALREADY]: pass # not connected yet + elif e.args[0] == 0: + # connected successfully (weird Linux bug?) + # Sometimes Linux seems to return EINVAL when it isn't + # invalid. This *may* be caused by a race condition + # between connect() and getsockopt(SO_ERROR) (ie. it + # finishes connecting in between the two, so there is no + # longer an error). However, I'm not sure of that. + # + # I did get at least one report that the problem went away + # when we added this, however. + self.connect_to = None elif e.args[0] == errno.EISCONN: # connected successfully (BSD) self.connect_to = None