Files
mongo/jstests/replsets/fastsync.js

195 lines
4.9 KiB
JavaScript
Raw Normal View History

2010-11-03 12:28:04 -04:00
/*
* 1. insert 100000 objects
* 2. export to two dbpaths
* 3. add one node w/fastsync
* 4. check that we never get "errmsg" : "initial sync cloning db: whatever"
* 5. check writes are replicated
*/
var w = 0;
var wait = function(f) {
w++;
var n = 0;
while (!f()) {
if( n % 4 == 0 )
print("toostale.js waiting " + w);
if (++n == 4) {
print("" + f);
}
assert(n < 200, 'tried 200 times, giving up');
sleep(1000);
}
}
var reconnect = function(a) {
2011-06-22 10:23:09 -04:00
wait(function() {
2010-11-03 12:28:04 -04:00
try {
a.getDB("foo").bar.stats();
return true;
} catch(e) {
print(e);
return false;
}
});
};
2011-06-24 17:56:07 -04:00
ports = allocatePorts( 4 );
2010-11-03 12:28:04 -04:00
var basename = "jstests_fastsync";
var basePath = "/data/db/" + basename;
var hostname = getHostName();
var pargs = new MongodRunner( ports[ 0 ], basePath + "-p", false, false,
2010-11-03 16:23:40 -04:00
["--replSet", basename, "--oplogSize", 2],
{no_bind : true} );
2010-11-03 12:28:04 -04:00
p = pargs.start();
var admin = p.getDB("admin");
var foo = p.getDB("foo");
var local = p.getDB("local");
var config = {_id : basename, members : [{_id : 0, host : hostname+":"+ports[0], priority:2}]};
2010-11-03 12:28:04 -04:00
printjson(config);
var result = admin.runCommand({replSetInitiate : config});
2010-11-13 12:59:13 -05:00
print("result:");
printjson(result);
2010-11-13 14:26:52 -05:00
var count = 0;
while (count < 10 && result.ok != 1) {
count++;
sleep(2000);
result = admin.runCommand({replSetInitiate : config});
2011-06-22 10:23:09 -04:00
}
2010-11-13 14:26:52 -05:00
assert(result.ok, tojson(result));
2011-05-06 10:50:44 -04:00
assert.soon(function() { result = false;
try {
result = admin.runCommand({isMaster:1}).ismaster;
}
catch(e) {
print(e);
return false;
}
return result;
});
2010-11-03 12:28:04 -04:00
print("1");
for (var i=0; i<100000; i++) {
foo.bar.insert({date : new Date(), x : i, str : "all the talk on the market"});
}
print("total in foo: "+foo.bar.count());
print("2");
admin.runCommand( {fsync:1,lock:1} );
2011-06-24 17:56:07 -04:00
copyDbpath( basePath + "-p", basePath + "-s"+1 );
2010-11-03 12:28:04 -04:00
admin.$cmd.sys.unlock.findOne();
print("3");
2011-06-24 17:56:07 -04:00
var startSlave = function(n) {
var sargs = new MongodRunner( ports[ n ], basePath + "-s"+n, false, false,
2010-11-03 16:23:40 -04:00
["--replSet", basename, "--fastsync",
"--oplogSize", 2], {no_bind : true} );
2011-06-24 17:56:07 -04:00
var reuseData = true;
var conn = sargs.start(reuseData);
config = local.system.replset.findOne();
config.version++;
config.members.push({_id:n, host:hostname+":"+ports[n]});
result = admin.runCommand({replSetReconfig : config});
2011-07-28 12:21:13 -04:00
printjson(result);
2011-06-24 17:56:07 -04:00
assert(result.ok, "reconfig worked");
reconnect(p);
print("4");
var status = admin.runCommand({replSetGetStatus : 1});
var count = 0;
while (status.members[n].state != 2 && count < 200) {
print("not a secondary yet");
if (count % 10 == 0) {
printjson(status);
}
assert(!status.members[n].errmsg || !status.members[n].errmsg.match("^initial sync cloning db"));
2010-11-03 12:28:04 -04:00
2011-06-24 17:56:07 -04:00
sleep(1000);
2010-11-03 12:28:04 -04:00
2011-06-24 17:56:07 -04:00
// disconnection could happen here
try {
status = admin.runCommand({replSetGetStatus : 1});
}
catch (e) {
print(e);
}
count++;
}
2010-11-03 12:28:04 -04:00
2011-06-24 17:56:07 -04:00
assert.eq(status.members[n].state, 2);
assert.soon(function() {
return admin.runCommand({isMaster : 1}).ismaster;
});
2011-06-24 17:56:07 -04:00
admin.foo.insert({x:1});
assert.soon(function() {
var last = local.oplog.rs.find().sort({$natural:-1}).limit(1).next();
var cur = conn.getDB("local").oplog.rs.find().sort({$natural:-1}).limit(1).next();
print("last: "+tojson(last)+" cur: "+tojson(cur));
return cur != null && last != null && cur.ts.t == last.ts.t && cur.ts.i == last.ts.i;
});
return conn;
};
var s1 = startSlave(1);
var me1 = s1.getDB("local").me.findOne();
print("me: " +me1._id);
assert(me1._id != null);
print("5");
s1.getDB("admin").runCommand( {fsync:1,lock:1} );
copyDbpath( basePath + "-s1", basePath + "-s2" );
s1.getDB("admin").$cmd.sys.unlock.findOne();
var s2 = startSlave(2);
var me2 = s2.getDB("local").me.findOne();
2010-11-03 12:28:04 -04:00
2011-06-24 17:56:07 -04:00
print("me: " +me2._id);
assert(me1._id != me2._id);
2011-06-22 10:23:09 -04:00
print("restart member with a different port and make it a new set");
try {
p.getDB("admin").runCommand({shutdown:1});
}
catch(e) {
print("good, shutting down: " +e);
}
sleep(10000);
2011-06-24 17:56:07 -04:00
pargs = new MongodRunner( ports[ 3 ], basePath + "-p", false, false,
2011-06-22 10:23:09 -04:00
["--replSet", basename, "--oplogSize", 2],
{no_bind : true} );
p = pargs.start(true);
printjson(p.getDB("admin").runCommand({replSetGetStatus:1}));
p.getDB("admin").runCommand({replSetReconfig : {
_id : basename,
2011-06-24 17:56:07 -04:00
members : [{_id:0, host : hostname+":"+ports[3]}]
2011-06-22 10:23:09 -04:00
}, force : true});
print("start waiting for primary...");
assert.soon(function() {
try {
return p.getDB("admin").runCommand({isMaster : 1}).ismaster;
}
catch(e) {
print(e);
}
return false;
}, "waiting for master", 60000);