Re: Millisecond-precision connect_timeout for libpq - Mailing list pgsql-hackers

From Andres Freund
Subject Re: Millisecond-precision connect_timeout for libpq
Date
Msg-id 20130709144319.GA27898@alap2.anarazel.de
Whole thread Raw
In response to Millisecond-precision connect_timeout for libpq  (ivan babrou <ibobrik@gmail.com>)
Responses Re: Millisecond-precision connect_timeout for libpq
List pgsql-hackers
On 2013-07-05 21:28:59 +0400, ivan babrou wrote:
> Hi, guys! I made a quick patch to support floating number in
> connect_timeout param for libpq. This will treat floating number as
> seconds so this is backwards-compatible. I don't usually write in C,
> so there may be mistakes. Could you review it and give me some
> feedback?
> 
> --
> Regards, Ian Babrou
> http://bobrik.name http://twitter.com/ibobrik skype:i.babrou

> diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c
> index 18fcb0c..58c1a35 100644
> --- a/src/interfaces/libpq/fe-connect.c
> +++ b/src/interfaces/libpq/fe-connect.c
> @@ -1452,7 +1452,7 @@ static int
>  connectDBComplete(PGconn *conn)
>  {
>      PostgresPollingStatusType flag = PGRES_POLLING_WRITING;
> -    time_t        finish_time = ((time_t) -1);
> +    struct timeval        finish_time;
>  
>      if (conn == NULL || conn->status == CONNECTION_BAD)
>          return 0;
> @@ -1462,17 +1462,14 @@ connectDBComplete(PGconn *conn)
>       */
>      if (conn->connect_timeout != NULL)
>      {
> -        int            timeout = atoi(conn->connect_timeout);
> +        int            timeout_usec = (int) (atof(conn->connect_timeout) * 1000000);

I'd rather not use a plain int for storing usecs. An overflow is rather
unlikely, but still. Also, I'd rather use something like USECS_PER_SEC
instead of a plain 1000000 in multiple places.

>  
> -        if (timeout > 0)
> +        if (timeout_usec > 0)
>          {
> -            /*
> -             * Rounding could cause connection to fail; need at least 2 secs
> -             */
> -            if (timeout < 2)
> -                timeout = 2;
> -            /* calculate the finish time based on start + timeout */
> -            finish_time = time(NULL) + timeout;
> +            gettimeofday(&finish_time, NULL);
> +            finish_time.tv_usec += (int) timeout_usec;

Accordingly adjust this.

Looks like a sensible thing to me.

*Independent* from this patch, you might want look into server-side
connection pooling using transaction mode. If that's applicable for
your application it might reduce latency noticeably.

Greetings,

Andres Freund

-- Andres Freund                       http://www.2ndQuadrant.com/PostgreSQL Development, 24x7 Support, Training &
Services



pgsql-hackers by date:

Previous
From: Andrew Dunstan
Date:
Subject: Re: Should we automatically run duplicate_oids?
Next
From: Sawada Masahiko
Date:
Subject: Re: Patch for fail-back without fresh backup