diff --git a/lib/topologies/mongos.js b/lib/topologies/mongos.js index a9b395801..e6438bb0c 100644 --- a/lib/topologies/mongos.js +++ b/lib/topologies/mongos.js @@ -568,13 +568,13 @@ function reconnectProxies(self, proxies, callback) { _self.on('parseError', handleEvent(self, 'parseError')); // Move to the connected servers - moveServerFrom(self.disconnectedProxies, self.connectedProxies, _self); + moveServerFrom(self.connectingProxies, self.connectedProxies, _self); // Emit topology Change emitTopologyDescriptionChanged(self); // Emit joined event self.emit('joined', 'mongos', _self); }); - } else if (event === 'connect' && self.authenticating) { + } else { // Move from connectingProxies moveServerFrom(self.connectingProxies, self.disconnectedProxies, _self); this.destroy(); @@ -613,6 +613,9 @@ function reconnectProxies(self, proxies, callback) { }) ); + _server.destroy(); + removeProxyFrom(self.disconnectedProxies, _server); + // Relay the server description change server.on('serverDescriptionChanged', function(event) { self.emit('serverDescriptionChanged', event); @@ -635,6 +638,7 @@ function reconnectProxies(self, proxies, callback) { relayEvents(server, self, ['commandStarted', 'commandSucceeded', 'commandFailed']); // Connect to proxy + self.connectingProxies.push(server); server.connect(self.s.connectOptions); }, i); } diff --git a/lib/topologies/server.js b/lib/topologies/server.js index 07192a7c4..1fa0a3ae5 100644 --- a/lib/topologies/server.js +++ b/lib/topologies/server.js @@ -1001,6 +1001,8 @@ var listeners = ['close', 'error', 'timeout', 'parseError', 'connect']; * @param {boolean} [options.force=false] Force destroy the pool */ Server.prototype.destroy = function(options) { + if (this._destroyed) return; + options = options || {}; var self = this; @@ -1013,7 +1015,10 @@ Server.prototype.destroy = function(options) { } // No pool, return - if (!self.s.pool) return; + if (!self.s.pool) { + this._destroyed = true; + return; + } // Emit close event if (options.emitClose) { @@ -1048,6 +1053,7 @@ Server.prototype.destroy = function(options) { // Destroy the pool this.s.pool.destroy(options.force); + this._destroyed = true; }; /**