Browse Source

Abstract out a Server.prototype.pause method

v0.7.4-release
Ryan Dahl 14 years ago
parent
commit
73cfda12bb
  1. 2
      benchmark/idle_server.js
  2. 39
      lib/net.js

2
benchmark/idle_server.js

@ -11,7 +11,7 @@ server = net.Server(function (socket) {
}); });
server.maxConnections = 128; //server.maxConnections = 128;
server.listen(9000); server.listen(9000);

39
lib/net.js

@ -960,7 +960,7 @@ function Server (/* [ options, ] listener */) {
// Just in case we don't have a dummy fd. // Just in case we don't have a dummy fd.
getDummyFD(); getDummyFD();
if (self._acceptTimer) { if (self._pauseTimer) {
// Somehow the watcher got started again. Need to wait until // Somehow the watcher got started again. Need to wait until
// the timer finishes. // the timer finishes.
self.watcher.stop(); self.watcher.stop();
@ -1022,6 +1022,28 @@ exports.createServer = function () {
}; };
// Just stop trying to accepting connections for a while.
// Useful for throttling against DoS attacks.
Server.prototype.pause = function (msecs) {
// We're already paused.
if (this._pauseTimer) return;
var self = this;
msecs = msecs || 1000;
this.watcher.stop();
// Wait a second before accepting more.
this._pauseTimer = setTimeout(function () {
// Our fd should still be there. If someone calls server.close() then
// the pauseTimer should be cleared.
assert(parseInt(self.fd) >= 0);
self._pauseTimer = null;
self.watcher.start();
}, msecs);
};
Server.prototype._rejectPending = function () { Server.prototype._rejectPending = function () {
var self = this; var self = this;
var acceptCount = 0; var acceptCount = 0;
@ -1034,14 +1056,7 @@ Server.prototype._rejectPending = function () {
// Don't become DoS'd by incoming requests // Don't become DoS'd by incoming requests
if (++acceptCount > 50) { if (++acceptCount > 50) {
assert(!this._acceptTimer); this.pause();
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; return;
} }
} }
@ -1174,6 +1189,11 @@ Server.prototype.close = function () {
close(self.fd); close(self.fd);
self.fd = null; self.fd = null;
if (self._pauseTimer) {
clearTimeout(self._pauseTimer);
self._pauseTimer = null;
}
if (self.type === "unix") { if (self.type === "unix") {
fs.unlink(self.path, function () { fs.unlink(self.path, function () {
self.emit("close"); self.emit("close");
@ -1183,6 +1203,7 @@ Server.prototype.close = function () {
} }
}; };
var dummyFD = null; var dummyFD = null;
var lastEMFILEWarning = 0; var lastEMFILEWarning = 0;
// Ensures to have at least on free file-descriptor free. // Ensures to have at least on free file-descriptor free.

Loading…
Cancel
Save