Browse Source

Merge remote-tracking branch 'public/bug9716_024'

Nick Mathewson 10 years ago
parent
commit
67bb1a44bd
2 changed files with 26 additions and 1 deletions
  1. 4 0
      changes/bug9716
  2. 22 1
      src/or/connection.c

+ 4 - 0
changes/bug9716

@@ -0,0 +1,4 @@
+  o Bugfixes (performance):
+    - Set the listen() backlog limit to the largest actually supported
+      on the system, not to the value in a header file. Fixes bug 9716;
+      bugfix on every released Tor.

+ 22 - 1
src/or/connection.c

@@ -963,6 +963,27 @@ make_socket_reuseable(tor_socket_t sock)
 #endif
 }
 
+/** Max backlog to pass to listen.  We start at */
+static int listen_limit = INT_MAX;
+
+/* Listen on <b>fd</b> with appropriate backlog. Return as for listen. */
+static int
+tor_listen(tor_socket_t fd)
+{
+  int r;
+
+  if ((r = listen(fd, listen_limit)) < 0) {
+    if (listen_limit == SOMAXCONN)
+      return r;
+    if ((r = listen(fd, SOMAXCONN)) == 0) {
+      listen_limit = SOMAXCONN;
+      log_warn(LD_NET, "Setting listen backlog to INT_MAX connections "
+               "didn't work, but SOMAXCONN did. Lowering backlog limit.");
+    }
+  }
+  return r;
+}
+
 /** Bind a new non-blocking socket listening to the socket described
  * by <b>listensockaddr</b>.
  *
@@ -1045,7 +1066,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
     }
 
     if (is_tcp) {
-      if (listen(s,SOMAXCONN) < 0) {
+      if (tor_listen(s) < 0) {
         log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort,
                  tor_socket_strerror(tor_socket_errno(s)));
         goto err;