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

Commit

Permalink
fix(mongos): remove listener on destroy event
Browse files Browse the repository at this point in the history
NODE-1216 #257
  • Loading branch information
Jessica Lord committed Dec 13, 2017
1 parent de0105c commit 243e942
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 4 deletions.
12 changes: 8 additions & 4 deletions lib/topologies/mongos.js
Expand Up @@ -299,10 +299,15 @@ Mongos.prototype.connect = function(options) {
);
});

const serverDescriptionChangedCallback = event => {
self.emit('serverDescriptionChanged', event);
};

servers.forEach(function(server) {
server.on('serverDescriptionChanged', function(event) {
self.emit('serverDescriptionChanged', event);
});
server.on('serverDescriptionChanged', serverDescriptionChangedCallback);
server.on('destroy', () =>
server.removeListener('serverDescriptionChanged', serverDescriptionChangedCallback)
);
});

// Emit the topology opening event
Expand Down Expand Up @@ -851,7 +856,6 @@ Mongos.prototype.destroy = function(options) {
// Move to list of disconnectedProxies
moveServerFrom(self.connectedProxies, self.disconnectedProxies, x);
});

// Emit the final topology change
emitTopologyDescriptionChanged(self);
// Emit toplogy closing event
Expand Down
54 changes: 54 additions & 0 deletions test/tests/unit/mongos/events_tests.js
@@ -0,0 +1,54 @@
'use strict';

const expect = require('chai').expect;
const Mongos = require('../../../../lib/topologies/mongos');
const mock = require('../../../mock');
const MongosFixture = require('../common').MongosFixture;

const test = new MongosFixture();

describe('EventEmitters (Mongos)', function() {
afterEach(() => mock.cleanup());
beforeEach(() => {
return mock.createServer().then(mockServer => {
test.server = mockServer;
});
});

it('should remove `serverDescriptionChanged` listeners when server is closed', {
metadata: { requires: { topology: ['single'] } },
test: function(done) {
test.server.setMessageHandler(req => {
const doc = req.document;
if (doc.ismaster) {
req.reply(Object.assign({}, test.defaultFields));
}
});

const mongos = new Mongos([test.server.address()], {
connectionTimeout: 30000,
socketTimeout: 30000,
haInterval: 500,
size: 1
});

mongos.on('error', done);
mongos.once('connect', () => {
expect(mongos.disconnectedProxies).to.have.length(1);
expect(mongos.disconnectedProxies[0].listenerCount('serverDescriptionChanged')).to.equal(1);
// After we connect, destroy/close the server
mongos.destroy();
mongos.on('topologyClosed', () => {
expect(mongos.disconnectedProxies).to.have.length(1);
expect(mongos.disconnectedProxies[0].listenerCount('serverDescriptionChanged')).to.equal(
0
);
});

done();
});

mongos.connect();
}
});
});

0 comments on commit 243e942

Please sign in to comment.