Skip to content

Commit

Permalink
http: avoid create new socket
Browse files Browse the repository at this point in the history
When active sockets less than or equal to max sockets limit,
should keep it instead of destroy it.

Example:

If maxSockets = 5 and a socket:4 become free, the freeSockets list will be:

before: socket:4 will be destroy
  freeSockets: [0], [1], [2], [3]

now: socket:4 will push to the end of list
  freeSockets: [0], [1], [2], [3], [4]
  • Loading branch information
fengmk2 committed Apr 4, 2015
1 parent 1e94057 commit 918e270
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/_http_agent.js
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ function Agent(options) {
if (self.sockets[name])
count += self.sockets[name].length;

if (count >= self.maxSockets || freeLen >= self.maxFreeSockets) {
if (count > self.maxSockets || freeLen >= self.maxFreeSockets) {
self.removeSocket(socket, options);
socket.destroy();
} else {
Expand Down
53 changes: 53 additions & 0 deletions test/parallel/test-http-agent-maxsockets.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
var common = require('../common');
var assert = require('assert');
var http = require('http');

var agent = new http.Agent({
keepAlive: true,
keepAliveMsecs: 1000,
maxSockets: 2,
maxFreeSockets: 2
});

var server = http.createServer(function(req, res) {
res.end('hello world');
});

function get(path, callback) {
return http.get({
host: 'localhost',
port: common.PORT,
agent: agent,
path: path
}, callback);
}

var count = 0;
function done() {
if (++count !== 2) {
return;
}
var freepool = agent.freeSockets[Object.keys(agent.freeSockets)[0]];
assert.equal(freepool.length, 2,
'expect keep 2 free sockets, but got ' + freepool.length);
agent.destroy();
server.close();
}

server.listen(common.PORT, function() {
get('/1', function(res) {
assert.equal(res.statusCode, 200);
res.resume();
res.on('end', function() {
process.nextTick(done);
});
});

get('/2', function(res) {
assert.equal(res.statusCode, 200);
res.resume();
res.on('end', function() {
process.nextTick(done);
});
});
});

0 comments on commit 918e270

Please sign in to comment.