diff options
| author | Rafael H. Schloming <rhs@apache.org> | 2009-10-11 14:36:14 +0000 |
|---|---|---|
| committer | Rafael H. Schloming <rhs@apache.org> | 2009-10-11 14:36:14 +0000 |
| commit | 88c3cf522a907532da77e1d8bc058035ce79eea8 (patch) | |
| tree | c32613db205b0448c91412e6b13e56b70e91a3e0 /qpid/python | |
| parent | 73ef7a3c81a7cccef9872810fb82f52ddc36340e (diff) | |
| download | qpid-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.py | 43 |
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 |
