Skip to content

Commit

Permalink
fix: wait until primary is transitioned from secondary for replicaSet
Browse files Browse the repository at this point in the history
  • Loading branch information
jardakotesovec authored and nodkz committed Jul 23, 2019
1 parent ba02479 commit 596fed8
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 15 deletions.
17 changes: 11 additions & 6 deletions packages/mongodb-memory-server-core/src/MongoMemoryReplSet.ts
Original file line number Diff line number Diff line change
Expand Up @@ -173,9 +173,9 @@ export default class MongoMemoryReplSet extends EventEmitter {
const server = this._startServer(this.getInstanceOpts({}));
servers.push(server);
}
// ensures all servers are listening for connection
await Promise.all(servers.map((s) => s.start()));
this.servers = servers;
// Brief delay to wait for servers to start up.
await new Promise((resolve) => setTimeout(resolve, 1000));
await this._initReplSet();
}

Expand Down Expand Up @@ -251,7 +251,7 @@ export default class MongoMemoryReplSet extends EventEmitter {

_startServer(instanceOpts: MongoMemoryInstancePropT): MongoMemoryServer {
const serverOpts: MongoMemoryServerOptsT = {
autoStart: true,
autoStart: false,
debug: this.opts.debug,
binary: this.opts.binary,
instance: instanceOpts,
Expand All @@ -265,13 +265,18 @@ export default class MongoMemoryReplSet extends EventEmitter {
if (!this.admin) {
return false;
}
const replStatus: ReplStatusResultT = await this.admin.command({ replSetGetStatus: 1 });
const replStatus: ReplStatusResultT = await this.admin.command({
serverStatus: 1,
metrics: 0,
locks: 0,
});
this.debug(' replStatus:', replStatus);
const hasPrimary = replStatus.members.some((m) => m.stateStr === 'PRIMARY');
const hasPrimary = replStatus.repl.ismaster;
if (!hasPrimary) {
this.debug('No PRIMARY yet. Waiting...');
return new Promise((resolve) => setTimeout(() => resolve(this._waitForPrimary()), 1000));
return new Promise((resolve) => setTimeout(() => resolve(this._waitForPrimary()), 500));
}

return true;
}
}
22 changes: 22 additions & 0 deletions packages/mongodb-memory-server-core/src/__tests__/replset-test.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import MongoMemoryReplSet from '../MongoMemoryReplSet';
import { MongoClient } from 'mongodb';

jasmine.DEFAULT_TIMEOUT_INTERVAL = 600000;

Expand Down Expand Up @@ -40,6 +41,16 @@ describe('single server replset', () => {
setTimeout(resolve, 500);
});
});

it('should be possible to connect replicaset after waitUntilRunning resolveds', async () => {
replSet = new MongoMemoryReplSet();
await replSet.waitUntilRunning();
const uri = await replSet.getUri();

await MongoClient.connect(`${uri}?replicaSet=testset`, {
useNewUrlParser: true,
});
});
});

describe('multi-member replica set', () => {
Expand All @@ -57,4 +68,15 @@ describe('multi-member replica set', () => {
const uri = await replSet.getUri();
expect(uri.split(',').length).toEqual(3);
}, 40000);

it('should be possible to connect replicaset after waitUntilRunning resolveds', async () => {
const opts: any = { replSet: { count: 3 } };
replSet = new MongoMemoryReplSet(opts);
await replSet.waitUntilRunning();
const uri = await replSet.getUri();

await MongoClient.connect(`${uri}?replicaSet=testset`, {
useNewUrlParser: true,
});
});
});
12 changes: 3 additions & 9 deletions packages/mongodb-memory-server-core/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,16 +30,10 @@ export interface MongoMemoryInstancePropT extends MongoMemoryInstancePropBaseT {
storageEngine?: StorageEngineT;
}

export interface ReplStatusMemberT {
_id: number;
name: string;
health: number;
state: number;
stateStr: string;
uptime: number;
export interface ReplStatusReplT {
ismaster: boolean;
}

export interface ReplStatusResultT {
set: string;
members: ReplStatusMemberT[];
repl: ReplStatusReplT;
}

0 comments on commit 596fed8

Please sign in to comment.