Fix connection_timeout to use time() and handle timeout == 1.

Code cleanup.
This commit is contained in:
Bruce Momjian 2002-10-16 02:55:30 +00:00
parent 8a96c50ec9
commit facb720073
3 changed files with 22 additions and 35 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.210 2002/10/15 01:48:25 tgl Exp $ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v 1.211 2002/10/16 02:55:30 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1052,10 +1052,7 @@ connectDBComplete(PGconn *conn)
{ {
PostgresPollingStatusType flag = PGRES_POLLING_WRITING; PostgresPollingStatusType flag = PGRES_POLLING_WRITING;
time_t finish_time = 0, time_t finish_time = -1;
current_time;
struct timeval remains,
*rp = NULL;
if (conn == NULL || conn->status == CONNECTION_BAD) if (conn == NULL || conn->status == CONNECTION_BAD)
return 0; return 0;
@ -1065,20 +1062,21 @@ connectDBComplete(PGconn *conn)
*/ */
if (conn->connect_timeout != NULL) if (conn->connect_timeout != NULL)
{ {
remains.tv_sec = atoi(conn->connect_timeout); int timeout = atoi(conn->connect_timeout);
if (!remains.tv_sec)
if (timeout == 0)
{ {
conn->status = CONNECTION_BAD; conn->status = CONNECTION_BAD;
return 0; return 0;
} }
remains.tv_usec = 0; /* We don't use subsecond timing */ /* Rounding could cause connection to fail;we need at least 2 secs */
rp = &remains; if (timeout == 1)
timeout++;
/* calculate the finish time based on start + timeout */ /* calculate the finish time based on start + timeout */
finish_time = time((time_t *) NULL) + remains.tv_sec; finish_time = time(NULL) + timeout;
} }
while (rp == NULL || remains.tv_sec > 0) while (finish_time == -1 || time(NULL) >= finish_time)
{ {
/* /*
* Wait, if necessary. Note that the initial state (just after * Wait, if necessary. Note that the initial state (just after
@ -1094,7 +1092,7 @@ connectDBComplete(PGconn *conn)
return 1; /* success! */ return 1; /* success! */
case PGRES_POLLING_READING: case PGRES_POLLING_READING:
if (pqWaitTimed(1, 0, conn, rp)) if (pqWaitTimed(1, 0, conn, finish_time))
{ {
conn->status = CONNECTION_BAD; conn->status = CONNECTION_BAD;
return 0; return 0;
@ -1102,7 +1100,7 @@ connectDBComplete(PGconn *conn)
break; break;
case PGRES_POLLING_WRITING: case PGRES_POLLING_WRITING:
if (pqWaitTimed(0, 1, conn, rp)) if (pqWaitTimed(0, 1, conn, finish_time))
{ {
conn->status = CONNECTION_BAD; conn->status = CONNECTION_BAD;
return 0; return 0;
@ -1119,20 +1117,6 @@ connectDBComplete(PGconn *conn)
* Now try to advance the state machine. * Now try to advance the state machine.
*/ */
flag = PQconnectPoll(conn); flag = PQconnectPoll(conn);
/*
* If connecting timeout is set, calculate remaining time.
*/
if (rp != NULL)
{
if (time(&current_time) == -1)
{
conn->status = CONNECTION_BAD;
return 0;
}
remains.tv_sec = finish_time - current_time;
}
} }
conn->status = CONNECTION_BAD; conn->status = CONNECTION_BAD;
return 0; return 0;

View File

@ -25,7 +25,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.83 2002/10/14 18:11:17 momjian Exp $ * $Header: /cvsroot/pgsql/src/interfaces/libpq/fe-misc.c,v 1.84 2002/10/16 02:55:30 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -779,11 +779,11 @@ pqFlush(PGconn *conn)
int int
pqWait(int forRead, int forWrite, PGconn *conn) pqWait(int forRead, int forWrite, PGconn *conn)
{ {
return pqWaitTimed(forRead, forWrite, conn, (const struct timeval *) NULL); return pqWaitTimed(forRead, forWrite, conn, -1);
} }
int int
pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval *timeout) pqWaitTimed(int forRead, int forWrite, PGconn *conn, time_t finish_time)
{ {
fd_set input_mask; fd_set input_mask;
fd_set output_mask; fd_set output_mask;
@ -820,7 +820,7 @@ retry5:
FD_SET(conn->sock, &output_mask); FD_SET(conn->sock, &output_mask);
FD_SET(conn->sock, &except_mask); FD_SET(conn->sock, &except_mask);
if (NULL != timeout) if (finish_time != -1)
{ {
/* /*
* select() may modify timeout argument on some platforms so * select() may modify timeout argument on some platforms so
@ -831,7 +831,9 @@ retry5:
* incorrect timings when select() is interrupted. * incorrect timings when select() is interrupted.
* bjm 2002-10-14 * bjm 2002-10-14
*/ */
tmp_timeout = *timeout; if ((tmp_timeout.tv_sec = finish_time - time(NULL)) < 0)
tmp_timeout.tv_sec = 0; /* possible? */
tmp_timeout.tv_usec = 0;
ptmp_timeout = &tmp_timeout; ptmp_timeout = &tmp_timeout;
} }
if (select(conn->sock + 1, &input_mask, &output_mask, if (select(conn->sock + 1, &input_mask, &output_mask,

View File

@ -12,7 +12,7 @@
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* $Id: libpq-int.h,v 1.59 2002/10/14 17:15:11 momjian Exp $ * $Id: libpq-int.h,v 1.60 2002/10/16 02:55:30 momjian Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -340,7 +340,8 @@ extern int pqReadData(PGconn *conn);
extern int pqFlush(PGconn *conn); extern int pqFlush(PGconn *conn);
extern int pqSendSome(PGconn *conn); extern int pqSendSome(PGconn *conn);
extern int pqWait(int forRead, int forWrite, PGconn *conn); extern int pqWait(int forRead, int forWrite, PGconn *conn);
extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn, const struct timeval *timeout); extern int pqWaitTimed(int forRead, int forWrite, PGconn *conn,
time_t finish_time);
extern int pqReadReady(PGconn *conn); extern int pqReadReady(PGconn *conn);
extern int pqWriteReady(PGconn *conn); extern int pqWriteReady(PGconn *conn);