diff options
author | Tom Lane | 2007-02-13 19:18:54 +0000 |
---|---|---|
committer | Tom Lane | 2007-02-13 19:18:54 +0000 |
commit | f6e91551de929af6f83fd4877cc5d0fadffcf8e5 (patch) | |
tree | abff107cd496065ec8644b2bda2c9432a2ebc790 | |
parent | 8b897de25d8ac55a152732ad3911c7975d81daf2 (diff) |
Improve postmaster's behavior if an accept() call fails. Because the server
socket is still read-ready, the code was a tight loop, wasting lots of CPU.
We can't do anything to clear the failure, other than wait, but we should give
other processes more chance to finish and release FDs; so insert a small sleep.
Also, avoid bogus "close(-1)" in this case. Per report from Jim Nasby.
-rw-r--r-- | src/backend/libpq/pqcomm.c | 10 | ||||
-rw-r--r-- | src/backend/postmaster/postmaster.c | 3 |
2 files changed, 11 insertions, 2 deletions
diff --git a/src/backend/libpq/pqcomm.c b/src/backend/libpq/pqcomm.c index c41983326d..3c0c5bbdd2 100644 --- a/src/backend/libpq/pqcomm.c +++ b/src/backend/libpq/pqcomm.c @@ -528,7 +528,7 @@ Setup_AF_UNIX(void) /* * StreamConnection -- create a new connection with client using - * server port. + * server port. Set port->sock to the FD of the new connection. * * ASSUME: that this doesn't need to be non-blocking because * the Postmaster uses select() to tell when the server master @@ -548,6 +548,14 @@ StreamConnection(int server_fd, Port *port) ereport(LOG, (errcode_for_socket_access(), errmsg("could not accept new connection: %m"))); + /* + * If accept() fails then postmaster.c will still see the server + * socket as read-ready, and will immediately try again. To avoid + * uselessly sucking lots of CPU, delay a bit before trying again. + * (The most likely reason for failure is being out of kernel file + * table slots; we can do little except hope some will get freed up.) + */ + pg_usleep(100000L); /* wait 0.1 sec */ return STATUS_ERROR; } diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index fdef23bce4..149ad18718 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -1710,7 +1710,8 @@ ConnCreate(int serverFd) if (StreamConnection(serverFd, port) != STATUS_OK) { - StreamClose(port->sock); + if (port->sock >= 0) + StreamClose(port->sock); ConnFree(port); port = NULL; } |