Skip to content
This repository was archived by the owner on Feb 4, 2022. It is now read-only.

Commit 2453746

Browse files
daprahamianmbroadst
authored andcommitted
fix(mongos): fix connection leak when mongos reconnects
Our mongos reconnect logic involved creating a new Server+Pool per proxy per iteration of the reconnect logic. These instances were never cleaned up, resulting in a huge number of connections when the proxies finally reconnected. Fixes NODE-1403
1 parent e9bef43 commit 2453746

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

lib/topologies/mongos.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -568,13 +568,13 @@ function reconnectProxies(self, proxies, callback) {
568568
_self.on('parseError', handleEvent(self, 'parseError'));
569569

570570
// Move to the connected servers
571-
moveServerFrom(self.disconnectedProxies, self.connectedProxies, _self);
571+
moveServerFrom(self.connectingProxies, self.connectedProxies, _self);
572572
// Emit topology Change
573573
emitTopologyDescriptionChanged(self);
574574
// Emit joined event
575575
self.emit('joined', 'mongos', _self);
576576
});
577-
} else if (event === 'connect' && self.authenticating) {
577+
} else {
578578
// Move from connectingProxies
579579
moveServerFrom(self.connectingProxies, self.disconnectedProxies, _self);
580580
this.destroy();
@@ -613,6 +613,9 @@ function reconnectProxies(self, proxies, callback) {
613613
})
614614
);
615615

616+
_server.destroy();
617+
removeProxyFrom(self.disconnectedProxies, _server);
618+
616619
// Relay the server description change
617620
server.on('serverDescriptionChanged', function(event) {
618621
self.emit('serverDescriptionChanged', event);
@@ -635,6 +638,7 @@ function reconnectProxies(self, proxies, callback) {
635638
relayEvents(server, self, ['commandStarted', 'commandSucceeded', 'commandFailed']);
636639

637640
// Connect to proxy
641+
self.connectingProxies.push(server);
638642
server.connect(self.s.connectOptions);
639643
}, i);
640644
}

lib/topologies/server.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,8 @@ var listeners = ['close', 'error', 'timeout', 'parseError', 'connect'];
10011001
* @param {boolean} [options.force=false] Force destroy the pool
10021002
*/
10031003
Server.prototype.destroy = function(options) {
1004+
if (this._destroyed) return;
1005+
10041006
options = options || {};
10051007
var self = this;
10061008

@@ -1013,7 +1015,10 @@ Server.prototype.destroy = function(options) {
10131015
}
10141016

10151017
// No pool, return
1016-
if (!self.s.pool) return;
1018+
if (!self.s.pool) {
1019+
this._destroyed = true;
1020+
return;
1021+
}
10171022

10181023
// Emit close event
10191024
if (options.emitClose) {
@@ -1048,6 +1053,7 @@ Server.prototype.destroy = function(options) {
10481053

10491054
// Destroy the pool
10501055
this.s.pool.destroy(options.force);
1056+
this._destroyed = true;
10511057
};
10521058

10531059
/**

0 commit comments

Comments
 (0)