Re: [HACKERS] listening addresses - Mailing list pgsql-patches

From Bruce Momjian
Subject Re: [HACKERS] listening addresses
Date
Msg-id 200403230004.i2N04QU20298@candle.pha.pa.us
Whole thread Raw
In response to Re: [HACKERS] listening addresses  (Andrew Dunstan <andrew@dunslane.net>)
List pgsql-patches
Patch applied by Tom.  Thanks.

---------------------------------------------------------------------------

Andrew Dunstan wrote:
>
>
> Andrew Dunstan wrote:
>
> >
> >
> > 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()?
> >>
> >>
> >>
> >
>
> Revised patch attached. I think this is about as much trouble as this
> problem is worth ;-)
>
> 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    22 Mar 2004 12:47:54 -0000
> ***************
> *** 191,196 ****
> --- 191,200 ----
>                  *addr,
>                   hints;
>       int            ret;
> +     fd_set      rset;
> +     struct timeval tv;
> +     char        test_byte;
> +     int         sel_res;
>
>       /*
>        * Force start of collector daemon if something to collect
> ***************
> *** 307,312 ****
> --- 311,365 ----
>               pgStatSock = -1;
>               continue;
>           }
> +
> + #define TESTBYTEVAL 99
> +
> +         /* try to send and receive a test byte on the socket */
> +
> +         test_byte = TESTBYTEVAL;
> +         if (send(pgStatSock,&test_byte,1,0) != 1)
> +         {
> +             ereport(LOG,
> +                     (errcode_for_socket_access(),
> +                      errmsg("test byte send failure socket for statistics collector: %m")));
> +             closesocket(pgStatSock);
> +             pgStatSock = -1;
> +             continue;
> +         }
> +         test_byte++;
> +         for(;;)
> +         {
> +             FD_ZERO(&rset);
> +             FD_SET(pgStatSock, &rset);
> +             tv.tv_sec = 0;
> +             tv.tv_usec = 500000;
> +             sel_res = select(pgStatSock+1,&rset,NULL,NULL,&tv);
> +             if (sel_res != -1 || errno != EINTR)
> +                 break;
> +         }
> +         if( sel_res > 0 && FD_ISSET(pgStatSock,&rset)
> +             && recv(pgStatSock,&test_byte,1,0) == 1)
> +         {
> +             if(test_byte != TESTBYTEVAL)
> +             {
> +                 ereport(LOG,
> +                         (errcode_for_socket_access(),
> +                          errmsg("incorrect test value on send/receive on socket for statistics collector")));
> +             closesocket(pgStatSock);
> +             pgStatSock = -1;
> +             continue;
> +             }
> +         }
> +         else
> +         {
> +             ereport(LOG,
> +                     (errcode_for_socket_access(),
> +                      errmsg("could receive test byte on socket for statistics collector: %m")));
> +             closesocket(pgStatSock);
> +             pgStatSock = -1;
> +             continue;
> +         }
> +
>
>           /* If we get here, we have a working socket */
>           break;

>
> ---------------------------(end of broadcast)---------------------------
> TIP 7: don't forget to increase your free space map settings

--
  Bruce Momjian                        |  http://candle.pha.pa.us
  pgman@candle.pha.pa.us               |  (610) 359-1001
  +  If your life is a hard drive,     |  13 Roberts Road
  +  Christ can be your backup.        |  Newtown Square, Pennsylvania 19073

pgsql-patches by date:

Previous
From: Tom Lane
Date:
Subject: Re: [HACKERS] listening addresses
Next
From: Tom Lane
Date:
Subject: Re: listening addresses