Abstract out net.Server.prototype._rejectPending
Does the same timeout action for maxConnections as it does for EMFILE.
This commit is contained in:
parent
74d0a077ec
commit
ad61d77fa3
@ -11,6 +11,8 @@ server = net.Server(function (socket) {
|
||||
|
||||
});
|
||||
|
||||
server.maxConnections = 128;
|
||||
|
||||
server.listen(9000);
|
||||
|
||||
var oldConnections, oldErrors;
|
||||
|
53
lib/net.js
53
lib/net.js
@ -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");
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user