]> granicus.if.org Git - postgresql/commitdiff
Improve postmaster's behavior if an accept() call fails. Because the server
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Feb 2007 19:18:54 +0000 (19:18 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Feb 2007 19:18:54 +0000 (19:18 +0000)
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.

src/backend/libpq/pqcomm.c
src/backend/postmaster/postmaster.c

index 4af679630357bfe5d8606a96879adc89defefeda..a8f40249c9d13eb162bfe096d25172020208fab7 100644 (file)
@@ -30,7 +30,7 @@
  * Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.189 2007/01/05 22:19:29 momjian Exp $
+ *     $PostgreSQL: pgsql/src/backend/libpq/pqcomm.c,v 1.190 2007/02/13 19:18:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -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;
        }
 
index 2c54ad7010e3649f79c4e867c54c6ed8a6a8a9e1..d0fe8451987a418f4332eb3f0db6b31723c55032 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.520 2007/02/11 11:59:25 mha Exp $
+ *       $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.521 2007/02/13 19:18:54 tgl Exp $
  *
  * NOTES
  *
@@ -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;
        }