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

Commit 243e942

Browse files
author
Jessica Lord
authored
fix(mongos): remove listener on destroy event
NODE-1216 #257
1 parent de0105c commit 243e942

File tree

2 files changed

+62
-4
lines changed

2 files changed

+62
-4
lines changed

lib/topologies/mongos.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -299,10 +299,15 @@ Mongos.prototype.connect = function(options) {
299299
);
300300
});
301301

302+
const serverDescriptionChangedCallback = event => {
303+
self.emit('serverDescriptionChanged', event);
304+
};
305+
302306
servers.forEach(function(server) {
303-
server.on('serverDescriptionChanged', function(event) {
304-
self.emit('serverDescriptionChanged', event);
305-
});
307+
server.on('serverDescriptionChanged', serverDescriptionChangedCallback);
308+
server.on('destroy', () =>
309+
server.removeListener('serverDescriptionChanged', serverDescriptionChangedCallback)
310+
);
306311
});
307312

308313
// Emit the topology opening event
@@ -851,7 +856,6 @@ Mongos.prototype.destroy = function(options) {
851856
// Move to list of disconnectedProxies
852857
moveServerFrom(self.connectedProxies, self.disconnectedProxies, x);
853858
});
854-
855859
// Emit the final topology change
856860
emitTopologyDescriptionChanged(self);
857861
// Emit toplogy closing event
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
'use strict';
2+
3+
const expect = require('chai').expect;
4+
const Mongos = require('../../../../lib/topologies/mongos');
5+
const mock = require('../../../mock');
6+
const MongosFixture = require('../common').MongosFixture;
7+
8+
const test = new MongosFixture();
9+
10+
describe('EventEmitters (Mongos)', function() {
11+
afterEach(() => mock.cleanup());
12+
beforeEach(() => {
13+
return mock.createServer().then(mockServer => {
14+
test.server = mockServer;
15+
});
16+
});
17+
18+
it('should remove `serverDescriptionChanged` listeners when server is closed', {
19+
metadata: { requires: { topology: ['single'] } },
20+
test: function(done) {
21+
test.server.setMessageHandler(req => {
22+
const doc = req.document;
23+
if (doc.ismaster) {
24+
req.reply(Object.assign({}, test.defaultFields));
25+
}
26+
});
27+
28+
const mongos = new Mongos([test.server.address()], {
29+
connectionTimeout: 30000,
30+
socketTimeout: 30000,
31+
haInterval: 500,
32+
size: 1
33+
});
34+
35+
mongos.on('error', done);
36+
mongos.once('connect', () => {
37+
expect(mongos.disconnectedProxies).to.have.length(1);
38+
expect(mongos.disconnectedProxies[0].listenerCount('serverDescriptionChanged')).to.equal(1);
39+
// After we connect, destroy/close the server
40+
mongos.destroy();
41+
mongos.on('topologyClosed', () => {
42+
expect(mongos.disconnectedProxies).to.have.length(1);
43+
expect(mongos.disconnectedProxies[0].listenerCount('serverDescriptionChanged')).to.equal(
44+
0
45+
);
46+
});
47+
48+
done();
49+
});
50+
51+
mongos.connect();
52+
}
53+
});
54+
});

0 commit comments

Comments
 (0)