AgentM <[EMAIL PROTECTED]> writes:
> Attached is a patch which corrects the behavior. I verified that the  
> patch does not interfere with normal operation (using psql) but  
> unfortunately the code path is virtually impossible to test without a  
> really slow connection to a postgresql server [which I thankfully  
> don't have]. To test the patch, you would need to send an interrupt  
> at the exact time that the kernel is connect()ing in blocking mode-  
> good luck.

I've applied a simplified version of this patch --- there is no need to
duplicate the functionality that the calling level must have anyway.

                        regards, tom lane

Index: fe-connect.c
===================================================================
RCS file: /cvsroot/pgsql/src/interfaces/libpq/fe-connect.c,v
retrieving revision 1.316
retrieving revision 1.317
diff -c -r1.316 -r1.317
*** fe-connect.c        9 Aug 2005 05:14:26 -0000       1.316
--- fe-connect.c        11 Aug 2005 22:53:41 -0000      1.317
***************
*** 1082,1096 ****
                                         * since we are in nonblock mode.  If 
it does, well,
                                         * too bad.
                                         */
-                       retry_connect:
                                        if (connect(conn->sock, 
addr_cur->ai_addr,
                                                                
addr_cur->ai_addrlen) < 0)
                                        {
-                                               if (SOCK_ERRNO == EINTR)
-                                                       /* Interrupted system 
call - just try again */
-                                                       goto retry_connect;
                                                if (SOCK_ERRNO == EINPROGRESS ||
                                                        SOCK_ERRNO == 
EWOULDBLOCK ||
                                                        SOCK_ERRNO == 0)
                                                {
                                                        /*
--- 1082,1093 ----
                                         * since we are in nonblock mode.  If 
it does, well,
                                         * too bad.
                                         */
                                        if (connect(conn->sock, 
addr_cur->ai_addr,
                                                                
addr_cur->ai_addrlen) < 0)
                                        {
                                                if (SOCK_ERRNO == EINPROGRESS ||
                                                        SOCK_ERRNO == 
EWOULDBLOCK ||
+                                                       SOCK_ERRNO == EINTR ||
                                                        SOCK_ERRNO == 0)
                                                {
                                                        /*

---------------------------(end of broadcast)---------------------------
TIP 3: Have you checked our extensive FAQ?

               http://www.postgresql.org/docs/faq

Reply via email to