Committed by Greg Sabino Mullane <[email protected]>

Revert kill version of ping testing: use better file
descriptor method as proposed by Tim Bunce. Change some of the ping logic in
dbdimp.c Still fails on a disconnect while in failed transaction. Not sure if
there is a clean way to detect that yet...

---
 dbdimp.c       |  9 ++++++---
 t/03dbmethod.t | 30 +++++++++++++++++++++++++-----
 2 files changed, 31 insertions(+), 8 deletions(-)

diff --git a/dbdimp.c b/dbdimp.c
index 334b19e..359865c 100644
--- a/dbdimp.c
+++ b/dbdimp.c
@@ -476,18 +476,21 @@ int dbd_db_ping (SV * dbh)
        /* No matter what state we are in, send a SELECT to the backend */
        status = _result(aTHX_ imp_dbh, "SELECT 'DBD::Pg ping test'");
 
+       /* If we are idle or in a transaction, we should see tuples */
        if (0 == tstatus || 2 == tstatus) {
 
-               /* If we are simply idle or in a transaction, we should see 
tuples */
-
                if (PGRES_TUPLES_OK == status) {
                        if (TEND_slow) TRC(DBILOGFP, "%sEnd dbd_pg_ping 
(result: 1 PGRES_TUPLES_OK)\n", THEADER_slow);
                        return 1+tstatus;
                }
 
+               /* Something is wrong, so we return an error */
+               return -2;
        }
 
-       /* A status of 7 could indicate a failed query or a dead database. We 
need PQstatus to be sure */
+       /* We are in some other state. As a status of 7 could be a bad query or 
a dead database,
+          we need to call PQstatus to be sure
+       */
        if (CONNECTION_BAD == PQstatus(imp_dbh->conn)) {
                if (TEND_slow) TRC(DBILOGFP, "%sEnd dbd_pg_ping (PQstatus 
returned CONNECTION_BAD)\n", THEADER_slow);
                return -3;
diff --git a/t/03dbmethod.t b/t/03dbmethod.t
index 77ba407..e78f75d 100644
--- a/t/03dbmethod.t
+++ b/t/03dbmethod.t
@@ -1925,17 +1925,37 @@ $t='DB handle method "ping" returns 1 on an idle 
connection';
 $dbh->commit();
 is ($dbh->ping(), 1, $t);
 
-$t='DB handle method "ping" returns 0 when the underlying connection is gone';
+$t='DB handle method "ping" returns 0 after a lost network connection (outside 
transaction)';
+my $fd = $dbh->{pg_socket} or die "Could not determine socket";
+open(DBH_PG_FH, "<&=".$fd) or die "Could not open socket: $!";
+close DBH_PG_FH or die "Could not close socket: $!";
+is ($dbh->ping(), 0, $t);
 
-$pid = $dbh->selectall_arrayref('SELECT pg_backend_pid()')->[0][0];
-$dbh->commit();
-kill 15, $pid;
-sleep 1;
+## Reconnect, and try the same thing but inside a transaction
+$t='DB handle method "ping" returns 0 after a lost network connection (inside 
transaction)';
+diag "About to call...";
+$dbh->disconnect();
+$dbh = connect_database({nosetup => 1});
+$dbh->do("SELECT 'DBD::Pg testing'");
+$fd = $dbh->{pg_socket} or die "Could not determine socket";
+open(DBH_PG_FH, "<&=".$fd) or die "Could not open socket: $!";
+close DBH_PG_FH or die "Could not close socket: $!";
+is ($dbh->ping(), 0, $t);
+
+$t='DB handle method "ping" returns 0 after a lost network connection (inside 
failed transaction)';
+$dbh->{InactiveDestroy} = 1;
+undef $dbh;
+$dbh = connect_database({nosetup => 1});
+eval { $dbh->do("SELECT 'DBD::Pg testing, will fail'::int"); };
+$fd = $dbh->{pg_socket} or die "Could not determine socket";
+open(DBH_PG_FH, "<&=".$fd) or die "Could not open socket: $!";
+close DBH_PG_FH or die "Could not close socket: $!";
 is ($dbh->ping(), 0, $t);
 
 $dbh->disconnect();
 $dbh = connect_database({nosetup => 1});
 
+
 #
 # Test of the "pg_ping" database handle method
 #
-- 
1.8.4

Reply via email to