Skip to content

Commit 3e91d77

Browse files
vkarpov15mbroadst
authored andcommitted
fix(mongos): bubble up close events after the first one (#1713)
Fix Automattic/mongoose#6249 Re: #1685
1 parent cc46750 commit 3e91d77

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

lib/topologies/mongos.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,9 @@ class Mongos extends TopologyBase {
268268
});
269269

270270
// Set up listeners
271-
self.s.coreTopology.once('timeout', errorHandler('timeout'));
272-
self.s.coreTopology.once('error', errorHandler('error'));
273-
self.s.coreTopology.once('close', errorHandler('close'));
271+
self.s.coreTopology.on('timeout', errorHandler('timeout'));
272+
self.s.coreTopology.on('error', errorHandler('error'));
273+
self.s.coreTopology.on('close', errorHandler('close'));
274274

275275
// Set up serverConfig listeners
276276
self.s.coreTopology.on('fullsetup', function() {

test/functional/sharding_connection_tests.js

+56
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
'use strict';
2+
3+
var co = require('co');
24
var f = require('util').format;
35
var test = require('./shared').assert;
46
var setupDatabase = require('./shared').setupDatabase;
@@ -168,4 +170,58 @@ describe('Sharding (Connection)', function() {
168170
);
169171
}
170172
});
173+
174+
/**
175+
* @ignore
176+
*/
177+
it('Should emit close event when mongos is stopped', {
178+
metadata: { requires: { topology: 'sharded' } },
179+
180+
// The actual test we wish to run
181+
test: function(done) {
182+
var configuration = this.configuration;
183+
var mongo = configuration.require;
184+
var MongoClient = mongo.MongoClient;
185+
var manager = configuration.manager;
186+
var mongos = manager.proxies;
187+
188+
co(function*() {
189+
var url = f(
190+
'mongodb://%s:%s,%s:%s/sharded_test_db',
191+
configuration.host,
192+
configuration.port,
193+
configuration.host,
194+
configuration.port + 1
195+
);
196+
197+
var client = yield MongoClient.connect(url);
198+
199+
var doc = { answer: 42 };
200+
var db = client.db('Test');
201+
var coll = db.collection('docs');
202+
yield coll.insertOne(doc);
203+
204+
doc = yield coll.findOne({ answer: 42 });
205+
test.ok(!!doc);
206+
207+
var waitForClose = new Promise(resolve => db.once('close', resolve));
208+
209+
yield mongos.map(p => p.stop());
210+
yield waitForClose;
211+
yield mongos.map(p => p.start());
212+
213+
doc = yield coll.findOne({ answer: 42 });
214+
test.ok(!!doc);
215+
216+
waitForClose = new Promise(resolve => db.once('close', resolve));
217+
218+
yield mongos.map(p => p.stop());
219+
yield waitForClose;
220+
yield mongos.map(p => p.start());
221+
222+
doc = yield coll.findOne({ answer: 42 });
223+
test.ok(!!doc);
224+
}).then(() => done(), done);
225+
}
226+
});
171227
});

0 commit comments

Comments
 (0)