summaryrefslogtreecommitdiff
path: root/qpid/python
diff options
context:
space:
mode:
authorRafael H. Schloming <rhs@apache.org>2009-10-11 14:36:14 +0000
committerRafael H. Schloming <rhs@apache.org>2009-10-11 14:36:14 +0000
commit88c3cf522a907532da77e1d8bc058035ce79eea8 (patch)
treec32613db205b0448c91412e6b13e56b70e91a3e0 /qpid/python
parent73ef7a3c81a7cccef9872810fb82f52ddc36340e (diff)
downloadqpid-python-88c3cf522a907532da77e1d8bc058035ce79eea8.tar.gz
catch socket errors on write as well as read
git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@824082 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'qpid/python')
-rw-r--r--qpid/python/qpid/driver.py43
1 files changed, 24 insertions, 19 deletions
diff --git a/qpid/python/qpid/driver.py b/qpid/python/qpid/driver.py
index a7a8b13819..13861aa215 100644
--- a/qpid/python/qpid/driver.py
+++ b/qpid/python/qpid/driver.py
@@ -190,10 +190,10 @@ class Driver:
log.debug("READ: %r", data)
else:
log.debug("ABORTED: %s", self._socket.getpeername())
- error = ("connection aborted",)
+ error = "connection aborted"
recoverable = True
except socket.error, e:
- error = (e,)
+ error = e
recoverable = True
if not error:
@@ -214,20 +214,13 @@ class Driver:
log.debug("RCVD: %r", op)
op.dispatch(self)
except VersionError, e:
- error = (e,)
+ error = e
except:
msg = compat.format_exc()
- error = (msg,)
+ error = msg
if error:
- self._socket.close()
- self.reset()
- if recoverable and self.connection.reconnect:
- self._timeout = time.time() + 3
- log.warn("recoverable error: %s" % error)
- log.warn("sleeping 3 seconds")
- else:
- self.connection.error = error
+ self._error(error, recoverable)
else:
self.dispatch()
@@ -241,9 +234,13 @@ class Driver:
@synchronized
def writeable(self):
- n = self._socket.send(self._buf)
- log.debug("SENT: %r", self._buf[:n])
- self._buf = self._buf[n:]
+ try:
+ n = self._socket.send(self._buf)
+ log.debug("SENT: %r", self._buf[:n])
+ self._buf = self._buf[n:]
+ except socket.error, e:
+ self._error(e, True)
+ self.connection._waiter.notifyAll()
@synchronized
def timeout(self):
@@ -251,6 +248,17 @@ class Driver:
self.dispatch()
self.connection._waiter.notifyAll()
+ def _error(self, err, recoverable):
+ if self._socket is not None:
+ self._socket.close()
+ self.reset()
+ if recoverable and self.connection.reconnect:
+ self._timeout = time.time() + 3
+ log.warn("recoverable error: %s" % err)
+ log.warn("sleeping 3 seconds")
+ else:
+ self.connection.error = (err,)
+
def write_op(self, op):
log.debug("SENT: %r", op)
self._op_enc.write(op)
@@ -372,10 +380,7 @@ class Driver:
self._timeout = None
except socket.error, e:
if self.connection.reconnect:
- self.reset()
- self._timeout = time.time() + 3
- log.warn("recoverable error: %s", e)
- log.warn("sleeping 3 seconds")
+ self._error(e, True)
return
else:
raise e