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;