From 952609bd4963b194b92ddd91e5a447899fa4ee57 Mon Sep 17 00:00:00 2001 From: hasezoey Date: Tue, 22 Aug 2023 12:22:44 +0200 Subject: [PATCH] feat(MongoMemoryServer): use storage engine "wiredTiger" if version is 7.0.0 or higher fixes #742 --- README.md | 2 +- .../interfaces/mongo-memory-instance-opts.md | 4 ++- docs/api/interfaces/replset-opts.md | 2 +- docs/guides/migration/migrate9.md | 7 ++++++ .../src/MongoMemoryReplSet.ts | 2 +- .../src/MongoMemoryServer.ts | 25 ++++++++++++++++++- .../src/__tests__/MongoMemoryServer.test.ts | 24 ++++++++++++++++++ .../MongoMemoryServer.test.ts.snap | 9 +++++++ 8 files changed, 70 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 7070ea225..ef60b6a1f 100644 --- a/README.md +++ b/README.md @@ -122,7 +122,7 @@ const mongod = new MongoMemoryServer({ ip?: string, // by default '127.0.0.1', for binding to all IP addresses set it to `::,0.0.0.0`, dbName?: string, // by default '' (empty string) dbPath?: string, // by default create in temp directory - storageEngine?: string, // by default `ephemeralForTest`, available engines: [ 'ephemeralForTest', 'wiredTiger' ] + storageEngine?: string, // by default `ephemeralForTest`(unless mongodb 7.0.0, where its `wiredTiger`), available engines: [ 'ephemeralForTest', 'wiredTiger' ] replSet?: string, // by default no replica set, replica set name args?: string[], // by default no additional arguments, any additional command line arguments for `mongod` `mongod` (ex. ['--notablescan']) }, diff --git a/docs/api/interfaces/mongo-memory-instance-opts.md b/docs/api/interfaces/mongo-memory-instance-opts.md index 8fedb87b0..dfacbc520 100644 --- a/docs/api/interfaces/mongo-memory-instance-opts.md +++ b/docs/api/interfaces/mongo-memory-instance-opts.md @@ -72,7 +72,7 @@ This option will automatically be set with a directory generated by [`mkdtemp`]( ### storageEngine Typings: `storageEngine?: StorageEngine` -Default: `ephemeralForTest` +Default: `ephemeralForTest` (unless mongodb version is `7.0.0`, where its `wiredTiger`) Set which storage engine to use, uses [`StorageEngine`](#helper-type-storageengine). @@ -98,4 +98,6 @@ Custom Explanation: MongoDB has stated that storage-engine `ephemeralForTest` is unstable and has been deprecated, it will be removed with mongodb 7. In MMS there has been no observation of `ephemeralForTest` being unstable (aside from some missing features) and will continue to be the default until mongodb-memory-server changes to a version where `ephemeralForTest` is not present anymore. + +With mongodb-memory-server 9.0.0, if mongodb 7.0.0 or higher is used, `wiredTiger` is the default engine. ::: diff --git a/docs/api/interfaces/replset-opts.md b/docs/api/interfaces/replset-opts.md index d47dfc38e..665d0183f 100644 --- a/docs/api/interfaces/replset-opts.md +++ b/docs/api/interfaces/replset-opts.md @@ -66,7 +66,7 @@ Also see [`MongoMemoryInstanceOpts.spawn`](./mongo-memory-instance-opts.md#spawn ### storageEngine Typings: `storageEngine?: StorageEngine` -Default: `"ephemeralForTest"` +Default: `"ephemeralForTest"` (unless mongodb version is `7.0.0`, where its `wiredTiger`) Set which Storage Engine to use, uses [`StorageEngine`](./mongo-memory-instance-opts.md#helper-type-storageengine). diff --git a/docs/guides/migration/migrate9.md b/docs/guides/migration/migrate9.md index 76d587634..17690c48a 100644 --- a/docs/guides/migration/migrate9.md +++ b/docs/guides/migration/migrate9.md @@ -109,3 +109,10 @@ This *should* help with non-closed instances not exiting the nodejs process. Previously MMS used `get-port`, but it caused some big memory-leakage across big projects, so it has been replaced with one that uses less maps. It also has been replaced because newer versions were ESM only, but we couldnt switch to ESM yet (and using ESM in CommonJS is not a great experience) + +## Mongodb version 7.0.0 is now supported + +Mongob version `7.0.0` removed storage engine `ephemeralForTest`, with mongodb-memory-server 9.0.0 storage engine `wiredTiger` is the default for binary versions `7.0.0` and higher. +Older versions (before `7.0.0`) will still continue to use `ephemeralForTest` by default. + +It is recommended to run those instances with a db path which is equivalent to [`tmpfs`](https://wiki.archlinux.org/title/tmpfs). diff --git a/packages/mongodb-memory-server-core/src/MongoMemoryReplSet.ts b/packages/mongodb-memory-server-core/src/MongoMemoryReplSet.ts index 064d477d0..314003139 100644 --- a/packages/mongodb-memory-server-core/src/MongoMemoryReplSet.ts +++ b/packages/mongodb-memory-server-core/src/MongoMemoryReplSet.ts @@ -81,7 +81,7 @@ export interface ReplSetOpts { spawn?: SpawnOptions; /** *`mongod` storage engine type - * @default 'ephemeralForTest' + * @default 'ephemeralForTest' unless mongodb version is `7.0.0`, where its `wiredTiger` */ storageEngine?: StorageEngine; /** diff --git a/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts b/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts index bb9fb6580..58f736341 100644 --- a/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts +++ b/packages/mongodb-memory-server-core/src/MongoMemoryServer.ts @@ -20,6 +20,8 @@ import { promises as fspromises } from 'fs'; import { AddUserOptions, MongoClient } from 'mongodb'; import { InstanceInfoError, StateError } from './util/errors'; import * as os from 'os'; +import { DryMongoBinary } from './util/DryMongoBinary'; +import * as semver from 'semver'; const log = debug('MongoMS:MongoMemoryServer'); @@ -375,12 +377,33 @@ export class MongoMemoryServer extends EventEmitter implements ManagerAdvanced { port = await this.getNewPort(port); } + const opts = await DryMongoBinary.generateOptions(this.opts.binary); + let storageEngine = instOpts.storageEngine; + + // warn when storage engine "ephemeralForTest" is explicitly used and switch to "wiredTiger" + if (storageEngine === 'ephemeralForTest' && semver.gte(opts.version, '7.0.0')) { + console.warn( + 'Storage Engine "ephemeralForTest" is removed since mongodb 7.0.0, automatically using "wiredTiger"!\n' + + 'This warning is because the mentioned storage engine is explicitly used and mongodb version is 7.0.0 or higher' + ); + + storageEngine = 'wiredTiger'; + } + + if (isNullOrUndefined(storageEngine)) { + if (semver.gte(opts.version, '7.0.0')) { + storageEngine = 'wiredTiger'; + } else { + storageEngine = 'ephemeralForTest'; + } + } + // consider directly using "this.opts.instance", to pass through all options, even if not defined in "StartupInstanceData" const data: StartupInstanceData = { port: port, dbName: generateDbName(instOpts.dbName), ip: instOpts.ip ?? '127.0.0.1', - storageEngine: instOpts.storageEngine ?? 'ephemeralForTest', + storageEngine: storageEngine, replSet: instOpts.replSet, dbPath: instOpts.dbPath, tmpDir: undefined, diff --git a/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts b/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts index fb1e0e300..b0f25d795 100644 --- a/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts +++ b/packages/mongodb-memory-server-core/src/__tests__/MongoMemoryServer.test.ts @@ -1113,4 +1113,28 @@ describe('MongoMemoryServer', () => { mongoServer._instanceInfo.tmpDir! ); // manual cleanup }); + + describe('server version specific', () => { + // should use default options that are supported for 7.0 (like not using "ephemeralForTest" by default) + it('should allow mongodb by default 7.0', async () => { + const server = await MongoMemoryServer.create({ binary: { version: '7.0.0' } }); + + await server.stop(); + }); + + it('should warn if "ephemeralForTest" is used explicitly in mongodb 7.0', async () => { + const spy = jest.spyOn(console, 'warn').mockImplementationOnce(() => {}); + const server = await MongoMemoryServer.create({ + binary: { version: '7.0.0' }, + instance: { storageEngine: 'ephemeralForTest' }, + }); + + expect(console.warn).toHaveBeenCalledTimes(1); + expect(spy.mock.calls).toMatchSnapshot(); + + expect(server.instanceInfo?.storageEngine).toStrictEqual('wiredTiger'); + + await server.stop(); + }); + }); }); diff --git a/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap b/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap index d51cc1ed2..03dee7547 100644 --- a/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap +++ b/packages/mongodb-memory-server-core/src/__tests__/__snapshots__/MongoMemoryServer.test.ts.snap @@ -36,6 +36,15 @@ This may be because of using a v6.x way of calling functions, look at the follow https://nodkz.github.io/mongodb-memory-server/docs/guides/migration/migrate7#no-function-other-than-start-create-ensureinstance-will-be-starting-anything" `; +exports[`MongoMemoryServer server version specific should warn if "ephemeralForTest" is used explicitly in mongodb 7.0 1`] = ` +Array [ + Array [ + "Storage Engine \\"ephemeralForTest\\" is removed since mongodb 7.0.0, automatically using \\"wiredTiger\\"! +This warning is because the mentioned storage engine is explicitly used and mongodb version is 7.0.0 or higher", + ], +] +`; + exports[`MongoMemoryServer start() should throw an error if state is not "new" or "stopped" 1`] = ` "Incorrect State for operation: \\"starting\\", allowed States: \\"[new,stopped]\\" This may be because of using a v6.x way of calling functions, look at the following guide if anything applies: