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.
// 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;
}
};
+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");
//
Server.prototype._doListen = function () {
var self = this;
-
+
// Ensure we have a dummy fd for EMFILE conditions.
getDummyFD();
console.error("(node) Hit max file limit. Increase 'ulimit -n'.");
lastEMFILEWarning = now;
}
-
+
if (dummyFD) {
close(dummyFD);
dummyFD = null;
dummyFD = null;
}
}
-}
\ No newline at end of file
+}