Skip to content

Commit 818055a

Browse files
committed
fix(sdam): don't emit close every time a child server closes
The `close` event was erroneously emitted every time a child server closed, which was not consistent with the legacy topology's behavior. Instead, the event is now emitted when the topology itself is closed. NODE-2251
1 parent 173f292 commit 818055a

File tree

1 file changed

+14
-23
lines changed

1 file changed

+14
-23
lines changed

lib/core/sdam/topology.js

+14-23
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ const resolveClusterTime = require('../topologies/shared').resolveClusterTime;
2626
const SrvPoller = require('./srv_polling').SrvPoller;
2727
const getMMAPError = require('../topologies/shared').getMMAPError;
2828
const makeStateMachine = require('../utils').makeStateMachine;
29+
const eachAsync = require('../utils').eachAsync;
2930

3031
// Global state
3132
let globalTopologyCounter = 0;
@@ -360,31 +361,22 @@ class Topology extends EventEmitter {
360361
// defer state transition because we may need to send an `endSessions` command above
361362
stateTransition(this, STATE_CLOSING);
362363

363-
const servers = this.s.servers;
364-
if (servers.size === 0) {
365-
stateTransition(this, STATE_CLOSED);
366-
if (typeof callback === 'function') {
367-
callback(null, null);
368-
}
364+
eachAsync(
365+
Array.from(this.s.servers.values()),
366+
(server, cb) => destroyServer(server, this, options, cb),
367+
() => {
368+
this.s.servers.clear();
369369

370-
return;
371-
}
370+
// emit an event for close
371+
this.emit('topologyClosed', new monitoring.TopologyClosedEvent(this.s.id));
372372

373-
// destroy all child servers
374-
let destroyed = 0;
375-
servers.forEach(server =>
376-
destroyServer(server, this, options, () => {
377-
destroyed++;
378-
if (destroyed === servers.size) {
379-
// emit an event for close
380-
this.emit('topologyClosed', new monitoring.TopologyClosedEvent(this.s.id));
381-
382-
stateTransition(this, STATE_CLOSED);
383-
if (typeof callback === 'function') {
384-
callback(null, null);
385-
}
373+
stateTransition(this, STATE_CLOSED);
374+
this.emit('close');
375+
376+
if (typeof callback === 'function') {
377+
callback();
386378
}
387-
})
379+
}
388380
);
389381
}
390382

@@ -942,7 +934,6 @@ function createAndConnectServer(topology, serverDescription) {
942934
server.once('connect', serverConnectEventHandler(server, topology));
943935
server.on('descriptionReceived', topology.serverUpdateHandler.bind(topology));
944936
server.on('error', serverErrorEventHandler(server, topology));
945-
server.on('close', () => topology.emit('close', server));
946937
server.connect();
947938
return server;
948939
}

0 commit comments

Comments
 (0)