Skip to content

Commit ff82ff4

Browse files
authored
fix(operations): do not call require in a hot path
1 parent 3da2a35 commit ff82ff4

File tree

5 files changed

+37
-12
lines changed

5 files changed

+37
-12
lines changed

lib/operations/collection_ops.js

+6-2
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,14 @@ const handleCallback = require('../utils').handleCallback;
1818
const indexInformationDb = require('./db_ops').indexInformation;
1919
const isObject = require('../utils').isObject;
2020
const Long = require('mongodb-core').BSON.Long;
21+
const makeLazyLoader = require('../utils').makeLazyLoader;
2122
const MongoError = require('mongodb-core').MongoError;
2223
const ReadPreference = require('mongodb-core').ReadPreference;
2324
const toError = require('../utils').toError;
2425

26+
const loadCollection = makeLazyLoader(`${__dirname}/../collection`);
27+
const loadDb = makeLazyLoader(`${__dirname}/../db`);
28+
2529
/**
2630
* Group function helper
2731
* @ignore
@@ -987,7 +991,7 @@ function mapReduce(coll, map, reduce, options, callback) {
987991
if (result.result != null && typeof result.result === 'object') {
988992
const doc = result.result;
989993
// Return a collection from another db
990-
const Db = require('../db');
994+
let Db = loadDb();
991995
collection = new Db(doc.db, coll.s.db.s.topology, coll.s.db.s.options).collection(
992996
doc.collection
993997
);
@@ -1204,7 +1208,7 @@ function removeDocuments(coll, selector, options, callback) {
12041208
* @param {Collection~collectionResultCallback} [callback] The results callback
12051209
*/
12061210
function rename(coll, newName, options, callback) {
1207-
const Collection = require('../collection');
1211+
let Collection = loadCollection();
12081212
// Check the collection name
12091213
checkCollectionName(newName);
12101214
// Build the command

lib/operations/cursor_ops.js

+7-4
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,12 @@
33
const buildCountCommand = require('./collection_ops').buildCountCommand;
44
const formattedOrderClause = require('../utils').formattedOrderClause;
55
const handleCallback = require('../utils').handleCallback;
6+
const makeLazyLoader = require('../utils').makeLazyLoader;
67
const MongoError = require('mongodb-core').MongoError;
78
const push = Array.prototype.push;
89

10+
const loadCursor = makeLazyLoader(`${__dirname}/../cursor`);
11+
912
/**
1013
* Get the count of documents for this cursor.
1114
*
@@ -74,7 +77,7 @@ function count(cursor, applySkipLimit, opts, callback) {
7477
* @param {Cursor~resultCallback} callback The result callback.
7578
*/
7679
function each(cursor, callback) {
77-
const Cursor = require('../cursor');
80+
let Cursor = loadCursor();
7881

7982
if (!callback) throw MongoError.create({ message: 'callback is mandatory', driver: true });
8083
if (cursor.isNotified()) return;
@@ -114,7 +117,7 @@ function each(cursor, callback) {
114117
* @param {Cursor~resultCallback} [callback] The result callback.
115118
*/
116119
function hasNext(cursor, callback) {
117-
const Cursor = require('../cursor');
120+
let Cursor = loadCursor();
118121

119122
if (cursor.s.currentDoc) {
120123
return callback(null, true);
@@ -165,7 +168,7 @@ function next(cursor, callback) {
165168

166169
// Get the next available document from the cursor, returns null if no more documents are available.
167170
function nextObject(cursor, callback) {
168-
const Cursor = require('../cursor');
171+
let Cursor = loadCursor();
169172

170173
if (cursor.s.state === Cursor.CLOSED || (cursor.isDead && cursor.isDead()))
171174
return handleCallback(
@@ -196,7 +199,7 @@ function nextObject(cursor, callback) {
196199
* @param {Cursor~toArrayResultCallback} [callback] The result callback.
197200
*/
198201
function toArray(cursor, callback) {
199-
const Cursor = require('../cursor');
202+
let Cursor = loadCursor();
200203

201204
const items = [];
202205

lib/operations/db_ops.js

+8-4
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ const resolveReadPreference = require('../utils').resolveReadPreference;
66
const crypto = require('crypto');
77
const debugOptions = require('../utils').debugOptions;
88
const handleCallback = require('../utils').handleCallback;
9+
const makeLazyLoader = require('../utils').makeLazyLoader;
910
const MongoError = require('mongodb-core').MongoError;
1011
const parseIndexOptions = require('../utils').parseIndexOptions;
1112
const ReadPreference = require('mongodb-core').ReadPreference;
@@ -17,6 +18,9 @@ const findOne = require('./collection_ops').findOne;
1718
const remove = require('./collection_ops').remove;
1819
const updateOne = require('./collection_ops').updateOne;
1920

21+
const loadCollection = makeLazyLoader(`${__dirname}/../collection`);
22+
const loadDb = makeLazyLoader(`${__dirname}/../db`);
23+
2024
const debugFields = [
2125
'authSource',
2226
'w',
@@ -64,7 +68,7 @@ const illegalCommandFields = [
6468
* @param {Db~resultCallback} [callback] The command result callback
6569
*/
6670
function addUser(db, username, password, options, callback) {
67-
const Db = require('../db');
71+
let Db = loadDb();
6872

6973
// Did the user destroy the topology
7074
if (db.serverConfig && db.serverConfig.isDestroyed())
@@ -132,7 +136,7 @@ function addUser(db, username, password, options, callback) {
132136
* @param {Db~collectionsResultCallback} [callback] The results callback
133137
*/
134138
function collections(db, options, callback) {
135-
const Collection = require('../collection');
139+
let Collection = loadCollection();
136140

137141
options = Object.assign({}, options, { nameOnly: true });
138142
// Let's get the collection names
@@ -172,7 +176,7 @@ function collections(db, options, callback) {
172176
* @param {Db~collectionResultCallback} [callback] The results callback
173177
*/
174178
function createCollection(db, name, options, callback) {
175-
const Collection = require('../collection');
179+
let Collection = loadCollection();
176180

177181
// Get the write concern options
178182
const finalOptions = applyWriteConcern(Object.assign({}, options), { db }, options);
@@ -632,7 +636,7 @@ function profilingLevel(db, options, callback) {
632636
* @param {Db~resultCallback} [callback] The command result callback
633637
*/
634638
function removeUser(db, username, options, callback) {
635-
const Db = require('../db');
639+
let Db = loadDb();
636640

637641
// Attempt to execute command
638642
executeAuthRemoveUserCommand(db, username, options, (err, result) => {

lib/operations/mongo_client_ops.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
const authenticate = require('../authenticate');
44
const deprecate = require('util').deprecate;
55
const Logger = require('mongodb-core').Logger;
6+
const makeLazyLoader = require('../utils').makeLazyLoader;
67
const MongoError = require('mongodb-core').MongoError;
78
const Mongos = require('../topologies/mongos');
89
const parse = require('mongodb-core').parseConnectionString;
@@ -11,6 +12,8 @@ const ReplSet = require('../topologies/replset');
1112
const Server = require('../topologies/server');
1213
const ServerSessionPool = require('mongodb-core').Sessions.ServerSessionPool;
1314

15+
const loadClient = makeLazyLoader(`${__dirname}/../mongo_client`);
16+
1417
const monitoringEvents = [
1518
'timeout',
1619
'close',
@@ -127,7 +130,7 @@ function clearAllEvents(topology) {
127130

128131
// Collect all events in order from SDAM
129132
function collectEvents(mongoClient, topology) {
130-
const MongoClient = require('../mongo_client');
133+
let MongoClient = loadClient();
131134
const collectedEvents = [];
132135

133136
if (mongoClient instanceof MongoClient) {

lib/utils.js

+12-1
Original file line numberDiff line numberDiff line change
@@ -694,6 +694,16 @@ function deprecateOptions(config, fn) {
694694
return deprecated;
695695
}
696696

697+
function makeLazyLoader(modulePath) {
698+
let mod;
699+
return function lazyLoad() {
700+
if (!mod) {
701+
mod = require(modulePath);
702+
}
703+
return mod;
704+
};
705+
}
706+
697707
module.exports = {
698708
filterOptions,
699709
mergeOptions,
@@ -719,5 +729,6 @@ module.exports = {
719729
isPromiseLike,
720730
decorateWithCollation,
721731
decorateWithReadConcern,
722-
deprecateOptions
732+
deprecateOptions,
733+
makeLazyLoader
723734
};

0 commit comments

Comments
 (0)