Abstract out net.Server.prototype._rejectPending

Does the same timeout action for maxConnections as it does for EMFILE.
This commit is contained in:
Ryan Dahl 2010-10-28 11:33:33 -07:00
parent 74d0a077ec
commit ad61d77fa3
2 changed files with 36 additions and 27 deletions

View File

@ -11,6 +11,8 @@ server = net.Server(function (socket) {
});
server.maxConnections = 128;
server.listen(9000);
var oldConnections, oldErrors;

View File

@ -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");
//