diff --git a/lib/core/sdam/topology.js b/lib/core/sdam/topology.js index 6bd570fbde..e8f1dc93dd 100644 --- a/lib/core/sdam/topology.js +++ b/lib/core/sdam/topology.js @@ -26,6 +26,7 @@ const resolveClusterTime = require('../topologies/shared').resolveClusterTime; const SrvPoller = require('./srv_polling').SrvPoller; const getMMAPError = require('../topologies/shared').getMMAPError; const makeStateMachine = require('../utils').makeStateMachine; +const eachAsync = require('../utils').eachAsync; // Global state let globalTopologyCounter = 0; @@ -360,31 +361,22 @@ class Topology extends EventEmitter { // defer state transition because we may need to send an `endSessions` command above stateTransition(this, STATE_CLOSING); - const servers = this.s.servers; - if (servers.size === 0) { - stateTransition(this, STATE_CLOSED); - if (typeof callback === 'function') { - callback(null, null); - } + eachAsync( + Array.from(this.s.servers.values()), + (server, cb) => destroyServer(server, this, options, cb), + () => { + this.s.servers.clear(); - return; - } + // emit an event for close + this.emit('topologyClosed', new monitoring.TopologyClosedEvent(this.s.id)); - // destroy all child servers - let destroyed = 0; - servers.forEach(server => - destroyServer(server, this, options, () => { - destroyed++; - if (destroyed === servers.size) { - // emit an event for close - this.emit('topologyClosed', new monitoring.TopologyClosedEvent(this.s.id)); - - stateTransition(this, STATE_CLOSED); - if (typeof callback === 'function') { - callback(null, null); - } + stateTransition(this, STATE_CLOSED); + this.emit('close'); + + if (typeof callback === 'function') { + callback(); } - }) + } ); } @@ -942,7 +934,6 @@ function createAndConnectServer(topology, serverDescription) { server.once('connect', serverConnectEventHandler(server, topology)); server.on('descriptionReceived', topology.serverUpdateHandler.bind(topology)); server.on('error', serverErrorEventHandler(server, topology)); - server.on('close', () => topology.emit('close', server)); server.connect(); return server; }