Skip to content

Commit

Permalink
mongo_runner: Don't send rs.initiate too early
Browse files Browse the repository at this point in the history
Fixes #1696. Thanks to @Maxpain177 for reporting and providing access to
a machine where this was easily reproducible.
  • Loading branch information
glasser committed Dec 20, 2013
1 parent 515e6f2 commit 995d728
Showing 1 changed file with 47 additions and 20 deletions.
67 changes: 47 additions & 20 deletions tools/mongo_runner.js
Expand Up @@ -234,36 +234,63 @@ exports.launchMongo = function (options) {
proc.stdout.setEncoding('utf8');
var listening = false;
var replSetReady = false;
var replSetReadyToBeInitiated = false;
var alreadyInitiatedReplSet = false;
var maybeCallOnListen = function () {
if (listening && replSetReady) {
if (createReplSet)
fs.writeFileSync(portFile, options.port);
onListen();
}
};

var maybeInitiateReplset = function () {
// We need to want to create a replset, be confident that the server is
// listening, be confident that the server's replset implementation is
// ready to be initiated, and have not already done it.
if (!(createReplSet && listening && replSetReadyToBeInitiated
&& !alreadyInitiatedReplSet)) {
return;
}

alreadyInitiatedReplSet = true;

// Connect to it and start a replset.
var db = new mongoNpmModule.Db(
'meteor', new mongoNpmModule.Server('127.0.0.1', options.port),
{safe: true});
db.open(function(err, db) {
if (err)
throw err;
db.admin().command({
replSetInitiate: {
_id: replSetName,
members: [{_id : 0, host: '127.0.0.1:' + options.port}]
}
}, function (err, result) {
if (err)
throw err;
// why this isn't in the error is unclear.
if (result && result.documents && result.documents[0]
&& result.documents[0].errmsg) {
throw result.document[0].errmsg;
}
db.close(true);
});
});
};

proc.stdout.on('data', function (data) {
// note: don't use "else ifs" in this, because 'data' can have multiple
// lines
if (/config from self or any seed \(EMPTYCONFIG\)/.test(data)) {
replSetReadyToBeInitiated = true;
maybeInitiateReplset();
}

if (/ \[initandlisten\] waiting for connections on port/.test(data)) {
if (createReplSet) {
// Connect to it and start a replset.
var db = new mongoNpmModule.Db(
'meteor', new mongoNpmModule.Server('127.0.0.1', options.port),
{safe: true});
db.open(function(err, db) {
if (err)
throw err;
db.admin().command({
replSetInitiate: {
_id: replSetName,
members: [{_id : 0, host: '127.0.0.1:' + options.port}]
}
}, function (err, result) {
if (err)
throw err;
db.close(true);
});
});
}
listening = true;
maybeInitiateReplset();
maybeCallOnListen();
}

Expand Down

0 comments on commit 995d728

Please sign in to comment.