Abstract out net.Server.prototype._rejectPending
authorRyan Dahl <ry@tinyclouds.org>
Thu, 28 Oct 2010 18:33:33 +0000 (11:33 -0700)
committerRyan Dahl <ry@tinyclouds.org>
Thu, 28 Oct 2010 18:33:35 +0000 (11:33 -0700)
Does the same timeout action for maxConnections as it does for EMFILE.

benchmark/idle_server.js
lib/net.js

index 53afc77..17d11a1 100644 (file)
@@ -11,6 +11,8 @@ server = net.Server(function (socket) {
 
 });
 
+server.maxConnections = 128;
+
 server.listen(9000);
 
 var oldConnections, oldErrors;
index d7c747d..fcb0750 100644 (file)
@@ -959,7 +959,7 @@ function Server (/* [ options, ] listener */) {
   self.watcher.callback = function () {
     // Just in case we don't have a dummy fd.
     getDummyFD();
-    
+
     if (self._acceptTimer) {
       // Somehow the watcher got started again. Need to wait until
       // the timer finishes.
@@ -975,36 +975,17 @@ function Server (/* [ options, ] listener */) {
         // Gracefully reject pending clients by freeing up a file
         // descriptor.
         rescueEMFILE(function() {
-          var acceptCount = 0;
-          // Accept and close the waiting clients one at a time.
-          // Single threaded programming ftw.
-          while (true) {
-            peerInfo = accept(self.fd);
-            if (!peerInfo) break;
-            close(peerInfo.fd);
-
-            // Don't become DoS'd by incoming requests
-            if (++acceptCount > 50) {
-              assert(!self._acceptTimer);
-              self.watcher.stop();
-              // Wait a second before accepting more.
-              self._acceptTimer = setTimeout(function () {
-                assert(parseInt(self.fd) >= 0);
-                self._acceptTimer = null;
-                self.watcher.start();
-              }, 1000);
-              break;
-            }
-          }
+          self._rejectPending();
         });
-        
         return;
       }
       if (!peerInfo) return;
 
       if (self.maxConnections && self.connections >= self.maxConnections) {
-        // Accept and close the connection.
+        // Close the connection we just had
         close(peerInfo.fd);
+        // Reject all other pending connectins.
+        self._rejectPending();
         return;
       }
 
@@ -1041,6 +1022,32 @@ exports.createServer = function () {
 };
 
 
+Server.prototype._rejectPending = function () {
+  var self = this;
+  var acceptCount = 0;
+  // Accept and close the waiting clients one at a time.
+  // Single threaded programming ftw.
+  while (true) {
+    peerInfo = accept(this.fd);
+    if (!peerInfo) return;
+    close(peerInfo.fd);
+
+    // Don't become DoS'd by incoming requests
+    if (++acceptCount > 50) {
+      assert(!this._acceptTimer);
+      this.watcher.stop();
+      // Wait a second before accepting more.
+      this._acceptTimer = setTimeout(function () {
+        assert(parseInt(self.fd) >= 0);
+        self._acceptTimer = null;
+        self.watcher.start();
+      }, 1000);
+      return;
+    }
+  }
+};
+
+
 // Listen on a UNIX socket
 // server.listen("/tmp/socket");
 //
@@ -1122,7 +1129,7 @@ Server.prototype._startWatcher = function () {
 
 Server.prototype._doListen = function () {
   var self = this;
-  
+
   // Ensure we have a dummy fd for EMFILE conditions.
   getDummyFD();
 
@@ -1187,7 +1194,7 @@ function rescueEMFILE(callback) {
     console.error("(node) Hit max file limit. Increase 'ulimit -n'.");
     lastEMFILEWarning = now;
   }
-  
+
   if (dummyFD) {
     close(dummyFD);
     dummyFD = null;
@@ -1204,4 +1211,4 @@ function getDummyFD() {
       dummyFD = null;
     }
   }
-}
\ No newline at end of file
+}