diff options
Diffstat (limited to 'src/backend/postmaster/pgstat.c')
-rw-r--r-- | src/backend/postmaster/pgstat.c | 28 |
1 files changed, 25 insertions, 3 deletions
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index ef826918995..765ee1fe203 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -13,7 +13,7 @@ * * Copyright (c) 2001-2005, PostgreSQL Global Development Group * - * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.87.4.2 2005/03/31 23:21:09 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.87.4.3 2006/07/16 18:17:35 tgl Exp $ * ---------- */ #include "postgres.h" @@ -337,8 +337,12 @@ pgstat_init(void) * packet filtering rules prevent it). */ test_byte = TESTBYTEVAL; + +retry1: if (send(pgStatSock, &test_byte, 1, 0) != 1) { + if (errno == EINTR) + goto retry1; /* if interrupted, just retry */ ereport(LOG, (errcode_for_socket_access(), errmsg("could not send test message on socket for statistics collector: %m"))); @@ -389,8 +393,11 @@ pgstat_init(void) test_byte++; /* just make sure variable is changed */ +retry2: if (recv(pgStatSock, &test_byte, 1, 0) != 1) { + if (errno == EINTR) + goto retry2; /* if interrupted, just retry */ ereport(LOG, (errcode_for_socket_access(), errmsg("could not receive test message on socket for statistics collector: %m"))); @@ -1329,13 +1336,24 @@ pgstat_setheader(PgStat_MsgHdr *hdr, int mtype) static void pgstat_send(void *msg, int len) { + int rc; + if (pgStatSock < 0) return; ((PgStat_MsgHdr *) msg)->m_size = len; - send(pgStatSock, msg, len, 0); - /* We deliberately ignore any error from send() */ + /* We'll retry after EINTR, but ignore all other failures */ + do + { + rc = send(pgStatSock, msg, len, 0); + } while (rc < 0 && errno == EINTR); + +#ifdef USE_ASSERT_CHECKING + /* In debug builds, log send failures ... */ + if (rc < 0) + elog(LOG, "could not send to statistics collector: %m"); +#endif } @@ -1863,9 +1881,13 @@ pgstat_recvbuffer(void) len = recv(pgStatSock, (char *) &input_buffer, sizeof(PgStat_Msg), 0); if (len < 0) + { + if (errno == EINTR) + continue; ereport(ERROR, (errcode_for_socket_access(), errmsg("could not read statistics message: %m"))); + } /* * We ignore messages that are smaller than our common header |