diff options
author | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-29 17:33:53 -0400 |
---|---|---|
committer | Mike Bayer <mike_mp@zzzcomputing.com> | 2014-09-29 17:33:53 -0400 |
commit | b6496ba3d28d685547eac2891bfea5f4ae60e834 (patch) | |
tree | 565b0c7e318cdffc88316f517a15e4d217d66728 | |
parent | 9a10b8a7f55d78620a77f8345e64718baec5ed91 (diff) | |
download | sqlalchemy-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
-rw-r--r-- | doc/build/changelog/changelog_09.rst | 13 | ||||
-rw-r--r-- | lib/sqlalchemy/dialects/postgresql/psycopg2.py | 14 |
2 files changed, 22 insertions, 5 deletions
diff --git a/doc/build/changelog/changelog_09.rst b/doc/build/changelog/changelog_09.rst index 7c75996a4..e5d6703e3 100644 --- a/doc/build/changelog/changelog_09.rst +++ b/doc/build/changelog/changelog_09.rst @@ -14,6 +14,19 @@ :version: 0.9.8 .. change:: + :tags: bug, postgresql + :versions: 1.0.0 + :tickets: 3021 + + 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. + + .. change:: :tags: bug, orm, engine :versions: 1.0.0 :tickets: 3197 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]: |