Skip to content

Commit c11d8c8

Browse files
Tom Leibombroadst
Tom Leibo
authored andcommitted
refactor(sessions): Performance Improvement
Changed the sessions structure to an object instead of an array so when we close a session we could remove it from the data structure more efficiently
1 parent 2061d25 commit c11d8c8

File tree

7 files changed

+14
-15
lines changed

7 files changed

+14
-15
lines changed

lib/mongo_client.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ function MongoClient(url, options) {
157157
options: options || {},
158158
promiseLibrary: null,
159159
dbCache: new Map(),
160-
sessions: [],
160+
sessions: new Set(),
161161
writeConcern: WriteConcern.fromOptions(options),
162162
namespace: new MongoDBNamespace('admin')
163163
};

lib/topologies/mongos.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ class Mongos extends TopologyBase {
194194
// Server Session Pool
195195
sessionPool: null,
196196
// Active client sessions
197-
sessions: [],
197+
sessions: new Set(),
198198
// Promise library
199199
promiseLibrary: options.promiseLibrary || Promise
200200
};

lib/topologies/replset.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ class ReplSet extends TopologyBase {
210210
// Server Session Pool
211211
sessionPool: null,
212212
// Active client sessions
213-
sessions: [],
213+
sessions: new Set(),
214214
// Promise library
215215
promiseLibrary: options.promiseLibrary || Promise
216216
};

lib/topologies/server.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,7 @@ class Server extends TopologyBase {
202202
// Server Session Pool
203203
sessionPool: null,
204204
// Active client sessions
205-
sessions: [],
205+
sessions: new Set(),
206206
// Promise library
207207
promiseLibrary: promiseLibrary || Promise
208208
};

lib/topologies/topology_base.js

+4-5
Original file line numberDiff line numberDiff line change
@@ -291,11 +291,12 @@ class TopologyBase extends EventEmitter {
291291

292292
startSession(options, clientOptions) {
293293
const session = new ClientSession(this, this.s.sessionPool, options, clientOptions);
294+
294295
session.once('ended', () => {
295-
this.s.sessions = this.s.sessions.filter(s => !s.equals(session));
296+
this.s.sessions.delete(session);
296297
});
297298

298-
this.s.sessions.push(session);
299+
this.s.sessions.add(session);
299300
return session;
300301
}
301302

@@ -382,9 +383,7 @@ class TopologyBase extends EventEmitter {
382383
close(forceClosed, callback) {
383384
// If we have sessions, we want to individually move them to the session pool,
384385
// and then send a single endSessions call.
385-
if (this.s.sessions.length) {
386-
this.s.sessions.forEach(session => session.endSession());
387-
}
386+
this.s.sessions.forEach(session => session.endSession());
388387

389388
if (this.s.sessionPool) {
390389
this.s.sessionPool.endAllPooledSessions();

test/functional/cursor_tests.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -4369,7 +4369,7 @@ describe('Cursor', function() {
43694369
const cursor = collection.find({});
43704370

43714371
cursor.next(function() {
4372-
test.equal(client.topology.s.sessions.length, 0);
4372+
test.equal(client.topology.s.sessions.size, 0);
43734373
client.close();
43744374
done();
43754375
});
@@ -4410,13 +4410,13 @@ describe('Cursor', function() {
44104410
test.equal(null, err);
44114411
const cursor = collection.find({}, { batchSize: 3 });
44124412
cursor.next(function() {
4413-
test.equal(client.topology.s.sessions.length, 1);
4413+
test.equal(client.topology.s.sessions.size, 1);
44144414
cursor.next(function() {
4415-
test.equal(client.topology.s.sessions.length, 1);
4415+
test.equal(client.topology.s.sessions.size, 1);
44164416
cursor.next(function() {
4417-
test.equal(client.topology.s.sessions.length, 1);
4417+
test.equal(client.topology.s.sessions.size, 1);
44184418
cursor.next(function() {
4419-
test.equal(client.topology.s.sessions.length, 0);
4419+
test.equal(client.topology.s.sessions.size, 0);
44204420
client.close();
44214421
done();
44224422
});

test/functional/sessions_tests.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ describe('Sessions', function() {
5050
expect(test.commands.started[0].commandName).to.equal('endSessions');
5151
expect(test.commands.started[0].command.endSessions).to.include.deep.members(sessions);
5252

53-
expect(client.s.sessions).to.have.length(0);
53+
test.equal(client.s.sessions.size, 0);
5454
done();
5555
});
5656
}

0 commit comments

Comments
 (0)