* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $Id: pqcomm.c,v 1.123 2001/11/05 17:46:25 momjian Exp $
+ * $Id: pqcomm.c,v 1.124 2001/11/12 04:54:08 tgl Exp $
*
*-------------------------------------------------------------------------
*/
continue; /* Ok if interrupted */
/*
- * We would like to use elog() here, but dare not because elog
- * tries to write to the client, which will cause problems if
- * we have a hard communications failure ... So just write the
- * message to the postmaster log.
+ * Careful: an elog() that tries to write to the client
+ * would cause recursion to here, leading to stack overflow
+ * and core dump! This message must go *only* to the postmaster
+ * log. elog(DEBUG) is presently safe.
*/
- fprintf(stderr, "pq_recvbuf: recv() failed: %s\n",
- strerror(errno));
+ elog(DEBUG, "pq_recvbuf: recv() failed: %m");
return EOF;
}
if (r == 0)
{
- /* as above, elog not safe */
- fprintf(stderr, "pq_recvbuf: unexpected EOF on client connection\n");
+ /* as above, only write to postmaster log */
+ elog(DEBUG, "pq_recvbuf: unexpected EOF on client connection");
return EOF;
}
/* r contains number of bytes read, so just incr length */
int
pq_flush(void)
{
+ static int last_reported_send_errno = 0;
+
unsigned char *bufptr = PqSendBuffer;
unsigned char *bufend = PqSendBuffer + PqSendPointer;
continue; /* Ok if we were interrupted */
/*
- * We would like to use elog() here, but cannot because elog
- * tries to write to the client, which would cause a recursive
- * flush attempt! So just write it out to the postmaster log.
+ * Careful: an elog() that tries to write to the client
+ * would cause recursion to here, leading to stack overflow
+ * and core dump! This message must go *only* to the postmaster
+ * log. elog(DEBUG) is presently safe.
+ *
+ * If a client disconnects while we're in the midst of output,
+ * we might write quite a bit of data before we get to a safe
+ * query abort point. So, suppress duplicate log messages.
*/
- fprintf(stderr, "pq_flush: send() failed: %s\n",
- strerror(errno));
+ if (errno != last_reported_send_errno)
+ {
+ last_reported_send_errno = errno;
+ elog(DEBUG, "pq_flush: send() failed: %m");
+ }
/*
* We drop the buffered data anyway so that processing can
PqSendPointer = 0;
return EOF;
}
+
+ last_reported_send_errno = 0; /* reset after any successful send */
bufptr += r;
}
+
PqSendPointer = 0;
return 0;
}
if (res < 0)
{
- /* don't try to elog here... */
- fprintf(stderr, "pq_eof: recv() failed: %s\n", strerror(errno));
+ /* can log to postmaster log only */
+ elog(DEBUG, "pq_eof: recv() failed: %m");
return EOF;
}
if (res == 0)