Re: [HACKERS] listening addresses - Mailing list pgsql-patches
| From | Andrew Dunstan |
|---|---|
| Subject | Re: [HACKERS] listening addresses |
| Date | |
| Msg-id | 405DC6D8.4040100@dunslane.net Whole thread Raw |
| Responses |
Re: [HACKERS] listening addresses
Re: [HACKERS] listening addresses |
| List | pgsql-patches |
Tom Lane wrote:
>Andrew Dunstan <andrew@dunslane.net> writes:
>
>
>>A small problem with it was reported to me a couple of days ago - user
>>had firewalled off all IP6 traffic. The stats collector happily bound
>>and connected to the socket, but all the packets fell in the bit bucket.
>>They found it quite hard to diagnose the problem.
>>
>>
>
>
>
>>Possible solutions that occurred to me:
>>. an initial "hello"-"yes i'm here" exchange to validate the address
>>
>>
>
>That one seems reasonable to me. Seems like it would take just a few
>more lines of code in the loop that tries to find a working socket to
>check that we can send a byte and receive it. You'd have to be careful
>not to block if the socket is indeed not working ... also, is it safe to
>assume that a byte sent with send() is *immediately* ready to recv()?
>
>
>
This patch attempts to implement the idea, with safety in case the
packet is not immediately available.
comments welcome
cheers
andrew
Index: src/backend/postmaster/pgstat.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/postmaster/pgstat.c,v
retrieving revision 1.61
diff -c -r1.61 pgstat.c
*** src/backend/postmaster/pgstat.c 15 Mar 2004 16:21:37 -0000 1.61
--- src/backend/postmaster/pgstat.c 21 Mar 2004 16:41:23 -0000
***************
*** 191,196 ****
--- 191,199 ----
*addr,
hints;
int ret;
+ fd_set rset;
+ struct timeval tv;
+ char test_byte;
/*
* Force start of collector daemon if something to collect
***************
*** 307,312 ****
--- 310,351 ----
pgStatSock = -1;
continue;
}
+
+ #define TESTBYTEVAL 99
+
+ /* try to send and receive a test byte on the socket */
+
+ FD_ZERO(&rset);
+ FD_SET(pgStatSock, &rset);
+ tv.tv_sec = 0;
+ tv.tv_usec = 500000;
+ test_byte = TESTBYTEVAL;
+ send(pgStatSock,&test_byte,1,0);
+ test_byte++;
+ if(select(pgStatSock+1,&rset,NULL,NULL,&tv) > 0 &&
+ FD_ISSET(pgStatSock,&rset))
+ {
+ recv(pgStatSock,&test_byte,1,0);
+ if(test_byte != TESTBYTEVAL)
+ {
+ ereport(LOG,
+ (errcode_for_socket_access(),
+ errmsg("incorrect test value on send/receive on socket for statistics collector: %m")));
+ closesocket(pgStatSock);
+ pgStatSock = -1;
+ continue;
+ }
+ }
+ else
+ {
+ ereport(LOG,
+ (errcode_for_socket_access(),
+ errmsg("could send/receive on socket for statistics collector: %m")));
+ closesocket(pgStatSock);
+ pgStatSock = -1;
+ continue;
+ }
+
/* If we get here, we have a working socket */
break;
pgsql-patches by date: