mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Fix connection_timeout to use time() and handle timeout == 1.
Code cleanup.
This commit is contained in:
parent
8a96c50ec9
commit
facb720073
@ -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(¤t_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;
|
||||||
|
@ -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,
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user