Skip to content

Commit 981226c

Browse files
committed
re-connect topology on client connect
1 parent 09dde51 commit 981226c

File tree

4 files changed

+20
-27
lines changed

4 files changed

+20
-27
lines changed

src/mongo_client.ts

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -349,29 +349,19 @@ export class MongoClient extends EventEmitter implements OperationParent {
349349
const force = typeof forceOrCallback === 'boolean' ? forceOrCallback : false;
350350

351351
return maybePromise(callback, cb => {
352-
const completeClose = (err?: AnyError) => {
353-
// clear out references to old topology
354-
this.topology = undefined;
355-
this.s.dbCache = new Map();
356-
this.s.sessions = new Set();
357-
358-
cb(err);
359-
};
360-
361352
if (this.topology == null) {
362-
completeClose();
363-
return;
353+
return cb();
364354
}
365355

366356
const topology = this.topology;
367357
topology.close({ force }, err => {
368358
const autoEncrypter = topology.s.options.autoEncrypter;
369359
if (!autoEncrypter) {
370-
completeClose(err);
360+
cb(err);
371361
return;
372362
}
373363

374-
autoEncrypter.teardown(force, err2 => completeClose(err || err2));
364+
autoEncrypter.teardown(force, err2 => cb(err || err2));
375365
});
376366
});
377367
}

src/operations/connect.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -361,18 +361,21 @@ function createTopology(mongoClient: MongoClient, options: MongoClientOptions, c
361361
options.autoEncrypter = new AutoEncrypter(mongoClient, mongoCryptOptions);
362362
}
363363

364-
// Create the topology
365-
const topology = new Topology(options.servers, options);
366-
registerDeprecatedEventNotifiers(mongoClient);
364+
// Create the topology or re-use a topology that was previously created
365+
if (!mongoClient.topology) {
366+
const topology = new Topology(options.servers, options);
367+
registerDeprecatedEventNotifiers(mongoClient);
367368

368-
// Add listeners
369-
addListeners(mongoClient, topology);
369+
// Add listeners
370+
addListeners(mongoClient, topology);
370371

371-
// Propagate the events to the client
372-
relayEvents(mongoClient, topology);
372+
// Propagate the events to the client
373+
relayEvents(mongoClient, topology);
373374

374-
// Assign the topology
375-
mongoClient.topology = topology;
375+
// Assign the topology
376+
mongoClient.topology = topology;
377+
}
378+
const topology = mongoClient.topology;
376379

377380
// initialize CSFLE if requested
378381
if (options.autoEncrypter) {

test/functional/connection.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,8 +280,8 @@ describe('Connection', function () {
280280
withClient(function (client, done) {
281281
expect(client.isConnected()).to.be.true;
282282

283-
const collection = () => client.db('testReconnect').collection('test');
284-
collection().insertOne({ a: 1 }, (err, result) => {
283+
const collection = client.db('testReconnect').collection('test');
284+
collection.insertOne({ a: 1 }, (err, result) => {
285285
expect(err).to.not.exist;
286286
expect(result).to.exist;
287287

@@ -293,7 +293,7 @@ describe('Connection', function () {
293293
expect(err).to.not.exist;
294294
expect(client.isConnected()).to.be.true;
295295

296-
collection().insertOne({ b: 2 }, (err, result) => {
296+
collection.insertOne({ b: 2 }, (err, result) => {
297297
expect(err).to.not.exist;
298298
expect(result).to.exist;
299299
expect(client.topology.isDestroyed()).to.be.false;

test/functional/sessions.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ describe('Sessions', function () {
123123
// verify that the `endSessions` command was sent
124124
const lastCommand = test.commands.started[test.commands.started.length - 1];
125125
expect(lastCommand.commandName).to.equal('endSessions');
126-
expect(client.topology).to.not.exist;
126+
expect(client.topology.s.sessionPool.sessions).to.have.length(0);
127127
});
128128
});
129129
});
@@ -143,7 +143,7 @@ describe('Sessions', function () {
143143
// verify that the `endSessions` command was sent
144144
const lastCommand = test.commands.started[test.commands.started.length - 1];
145145
expect(lastCommand.commandName).to.equal('endSessions');
146-
expect(client.topology).to.not.exist;
146+
expect(client.topology.s.sessionPool.sessions).to.have.length(0);
147147
});
148148
});
149149
}

0 commit comments

Comments
 (0)