Skip to content

Commit

Permalink
Fix connection leaks: - Close connection before reassigning server re…
Browse files Browse the repository at this point in the history
…ference - Fix how servers are iterated when closing
  • Loading branch information
elbert3 authored and christkv committed Sep 10, 2012
1 parent d247ea2 commit f75f560
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions lib/mongodb/connection/repl_set.js
Original file line number Diff line number Diff line change
Expand Up @@ -475,6 +475,10 @@ var _connectHandler = function(self, candidateServers, instanceServer) {
}

// Make sure we have the right reference
if (self._state.addresses[instanceServer.host + ":" + instanceServer.port] != instanceServer) {
// Close the connection before deleting
self._state.addresses[instanceServer.host + ":" + instanceServer.port].close();
}
delete self._state.addresses[instanceServer.host + ":" + instanceServer.port];
self._state.addresses[me] = instanceServer;

Expand Down Expand Up @@ -556,6 +560,13 @@ var _connectHandler = function(self, candidateServers, instanceServer) {
server.enableRecordQueryStats(self.recordQueryStats);

// Set the server
if (addresses[server.host + ":" + server.port] != server) {
if (addresses[server.host + ":" + server.port]) {
// Close the connection before deleting
addresses[server.host + ":" + server.port].close();
}
delete addresses[server.host + ":" + server.port];
}
addresses[server.host + ":" + server.port] = server;
// Connect
server.connect(self.db, {returnIsMasterResults: true, eventReceiver:server}, _connectHandler(self, candidateServers, server));
Expand Down Expand Up @@ -659,8 +670,9 @@ ReplSet.prototype.connect = function(parent, options, callback) {

// Get the list of servers that is deduplicated and start connecting
var candidateServers = [];
for(var key in addresses) {
candidateServers.push(addresses[key]);
var keys = Object.keys(addresses);
for(var i = 0; i < keys.length; i++) {
candidateServers.push(addresses[keys[i]]);
}
// Let's connect to the first one on the list
server = candidateServers.pop();
Expand Down Expand Up @@ -942,8 +954,10 @@ ReplSet.prototype.close = function(callback) {
this._serverState = 'disconnected';
// Close all servers
if(this._state && this._state.addresses) {
for(var key in this._state.addresses) {
this._state.addresses[key].close();
var keys = Object.keys(this._state.addresses);
// Iterate over all server instances
for(var i = 0; i < keys.length; i++) {
this._state.addresses[keys[i]].close();
}
}

Expand Down

0 comments on commit f75f560

Please sign in to comment.