diff options
Diffstat (limited to 'src/backend/libpq/pqcomm.c')
-rw-r--r-- | src/backend/libpq/pqcomm.c | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index e3250862363..81c57a4e8d7 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -29,7 +29,7 @@ * Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $Id: pqcomm.c,v 1.117 2001/03/22 03:59:30 momjian Exp $ + * $Id: pqcomm.c,v 1.118 2001/07/11 19:03:07 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -80,11 +80,6 @@ #include "miscadmin.h" -#ifndef SOMAXCONN -#define SOMAXCONN 5 /* from Linux listen(2) man page */ -#endif - - static void pq_close(void); @@ -185,6 +180,7 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber, SockAddr saddr; int fd, err; + int maxconn; size_t len = 0; int one = 1; @@ -350,7 +346,25 @@ StreamServerPort(int family, char *hostName, unsigned short portNumber, } #endif /* HAVE_UNIX_SOCKETS */ - listen(fd, SOMAXCONN); + /* + * Select appropriate accept-queue length limit. PG_SOMAXCONN is + * only intended to provide a clamp on the request on platforms where + * an overly large request provokes a kernel error (are there any?). + */ + maxconn = MaxBackends * 2; + if (maxconn > PG_SOMAXCONN) + maxconn = PG_SOMAXCONN; + + err = listen(fd, maxconn); + if (err < 0) + { + snprintf(PQerrormsg, PQERRORMSG_LENGTH, + "FATAL: StreamServerPort: listen() failed: %s\n", + strerror(errno)); + fputs(PQerrormsg, stderr); + pqdebug("%s", PQerrormsg); + return STATUS_ERROR; + } *fdP = fd; |