diff --git a/NEWS b/NEWS index e0dd56e8..54a9e6e6 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,7 @@ What's new in psycopg 2.5.3 the superclass init (:ticket:`#195`). - Mark the connection closed when a Socket connection is broken, as it happens for TCP connections instead (:ticket:`#196`). +- Mark the connection closed if found broken on `poll()`. - Fixed possible segfault in named cursors creation. - It is now possible to call `get_transaction_status()` on closed connections. - Fixed debug build on Windows, thanks to James Emerton. diff --git a/psycopg/pqpath.c b/psycopg/pqpath.c index 16b733f4..a19c05a8 100644 --- a/psycopg/pqpath.c +++ b/psycopg/pqpath.c @@ -807,6 +807,12 @@ pq_is_busy(connectionObject *conn) Dprintf("pq_is_busy: PQconsumeInput() failed"); pthread_mutex_unlock(&(conn->lock)); Py_BLOCK_THREADS; + + /* if the libpq says pgconn is lost, close the py conn */ + if (CONNECTION_BAD == PQstatus(conn->pgconn)) { + conn->closed = 2; + } + PyErr_SetString(OperationalError, PQerrorMessage(conn->pgconn)); return -1; } @@ -836,6 +842,12 @@ pq_is_busy_locked(connectionObject *conn) if (PQconsumeInput(conn->pgconn) == 0) { Dprintf("pq_is_busy_locked: PQconsumeInput() failed"); + + /* if the libpq says pgconn is lost, close the py conn */ + if (CONNECTION_BAD == PQstatus(conn->pgconn)) { + conn->closed = 2; + } + PyErr_SetString(OperationalError, PQerrorMessage(conn->pgconn)); return -1; }