summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2014-09-29 17:33:53 -0400
committerMike Bayer <mike_mp@zzzcomputing.com>2014-09-29 17:33:53 -0400
commitb6496ba3d28d685547eac2891bfea5f4ae60e834 (patch)
tree565b0c7e318cdffc88316f517a15e4d217d66728 /lib
parent9a10b8a7f55d78620a77f8345e64718baec5ed91 (diff)
downloadsqlalchemy-b6496ba3d28d685547eac2891bfea5f4ae60e834.tar.gz
- A revisit to this issue first patched in 0.9.5, apparently
psycopg2's ``.closed`` accessor is not as reliable as we assumed, so we have added an explicit check for the exception messages "SSL SYSCALL error: Bad file descriptor" and "SSL SYSCALL error: EOF detected" when detecting an is-disconnect scenario. We will continue to consult psycopg2's connection.closed as a first check. fixes #3021
Diffstat (limited to 'lib')
-rw-r--r--lib/sqlalchemy/dialects/postgresql/psycopg2.py14
1 files changed, 9 insertions, 5 deletions
diff --git a/lib/sqlalchemy/dialects/postgresql/psycopg2.py b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
index e6450c97f..9dfd53e22 100644
--- a/lib/sqlalchemy/dialects/postgresql/psycopg2.py
+++ b/lib/sqlalchemy/dialects/postgresql/psycopg2.py
@@ -512,12 +512,14 @@ class PGDialect_psycopg2(PGDialect):
def is_disconnect(self, e, connection, cursor):
if isinstance(e, self.dbapi.Error):
# check the "closed" flag. this might not be
- # present on old psycopg2 versions
+ # present on old psycopg2 versions. Also,
+ # this flag doesn't actually help in a lot of disconnect
+ # situations, so don't rely on it.
if getattr(connection, 'closed', False):
return True
- # legacy checks based on strings. the "closed" check
- # above most likely obviates the need for any of these.
+ # checks based on strings. in the case that .closed
+ # didn't cut it, fall back onto these.
str_e = str(e).partition("\n")[0]
for msg in [
# these error messages from libpq: interfaces/libpq/fe-misc.c
@@ -534,8 +536,10 @@ class PGDialect_psycopg2(PGDialect):
# not sure where this path is originally from, it may
# be obsolete. It really says "losed", not "closed".
'losed the connection unexpectedly',
- # this can occur in newer SSL
- 'connection has been closed unexpectedly'
+ # these can occur in newer SSL
+ 'connection has been closed unexpectedly',
+ 'SSL SYSCALL error: Bad file descriptor',
+ 'SSL SYSCALL error: EOF detected',
]:
idx = str_e.find(msg)
if idx >= 0 and '"' not in str_e[:idx]: