Skip to content

Commit 596fed8

Browse files
jardakotesovecnodkz
authored andcommitted
fix: wait until primary is transitioned from secondary for replicaSet
1 parent ba02479 commit 596fed8

File tree

3 files changed

+36
-15
lines changed

3 files changed

+36
-15
lines changed

packages/mongodb-memory-server-core/src/MongoMemoryReplSet.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -173,9 +173,9 @@ export default class MongoMemoryReplSet extends EventEmitter {
173173
const server = this._startServer(this.getInstanceOpts({}));
174174
servers.push(server);
175175
}
176+
// ensures all servers are listening for connection
177+
await Promise.all(servers.map((s) => s.start()));
176178
this.servers = servers;
177-
// Brief delay to wait for servers to start up.
178-
await new Promise((resolve) => setTimeout(resolve, 1000));
179179
await this._initReplSet();
180180
}
181181

@@ -251,7 +251,7 @@ export default class MongoMemoryReplSet extends EventEmitter {
251251

252252
_startServer(instanceOpts: MongoMemoryInstancePropT): MongoMemoryServer {
253253
const serverOpts: MongoMemoryServerOptsT = {
254-
autoStart: true,
254+
autoStart: false,
255255
debug: this.opts.debug,
256256
binary: this.opts.binary,
257257
instance: instanceOpts,
@@ -265,13 +265,18 @@ export default class MongoMemoryReplSet extends EventEmitter {
265265
if (!this.admin) {
266266
return false;
267267
}
268-
const replStatus: ReplStatusResultT = await this.admin.command({ replSetGetStatus: 1 });
268+
const replStatus: ReplStatusResultT = await this.admin.command({
269+
serverStatus: 1,
270+
metrics: 0,
271+
locks: 0,
272+
});
269273
this.debug(' replStatus:', replStatus);
270-
const hasPrimary = replStatus.members.some((m) => m.stateStr === 'PRIMARY');
274+
const hasPrimary = replStatus.repl.ismaster;
271275
if (!hasPrimary) {
272276
this.debug('No PRIMARY yet. Waiting...');
273-
return new Promise((resolve) => setTimeout(() => resolve(this._waitForPrimary()), 1000));
277+
return new Promise((resolve) => setTimeout(() => resolve(this._waitForPrimary()), 500));
274278
}
279+
275280
return true;
276281
}
277282
}

packages/mongodb-memory-server-core/src/__tests__/replset-test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import MongoMemoryReplSet from '../MongoMemoryReplSet';
2+
import { MongoClient } from 'mongodb';
23

34
jasmine.DEFAULT_TIMEOUT_INTERVAL = 600000;
45

@@ -40,6 +41,16 @@ describe('single server replset', () => {
4041
setTimeout(resolve, 500);
4142
});
4243
});
44+
45+
it('should be possible to connect replicaset after waitUntilRunning resolveds', async () => {
46+
replSet = new MongoMemoryReplSet();
47+
await replSet.waitUntilRunning();
48+
const uri = await replSet.getUri();
49+
50+
await MongoClient.connect(`${uri}?replicaSet=testset`, {
51+
useNewUrlParser: true,
52+
});
53+
});
4354
});
4455

4556
describe('multi-member replica set', () => {
@@ -57,4 +68,15 @@ describe('multi-member replica set', () => {
5768
const uri = await replSet.getUri();
5869
expect(uri.split(',').length).toEqual(3);
5970
}, 40000);
71+
72+
it('should be possible to connect replicaset after waitUntilRunning resolveds', async () => {
73+
const opts: any = { replSet: { count: 3 } };
74+
replSet = new MongoMemoryReplSet(opts);
75+
await replSet.waitUntilRunning();
76+
const uri = await replSet.getUri();
77+
78+
await MongoClient.connect(`${uri}?replicaSet=testset`, {
79+
useNewUrlParser: true,
80+
});
81+
});
6082
});

packages/mongodb-memory-server-core/src/types.ts

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,10 @@ export interface MongoMemoryInstancePropT extends MongoMemoryInstancePropBaseT {
3030
storageEngine?: StorageEngineT;
3131
}
3232

33-
export interface ReplStatusMemberT {
34-
_id: number;
35-
name: string;
36-
health: number;
37-
state: number;
38-
stateStr: string;
39-
uptime: number;
33+
export interface ReplStatusReplT {
34+
ismaster: boolean;
4035
}
4136

4237
export interface ReplStatusResultT {
43-
set: string;
44-
members: ReplStatusMemberT[];
38+
repl: ReplStatusReplT;
4539
}

0 commit comments

Comments
 (0)