This is just a cleanup work to hide some of the private state of ReplSetTest so it is easier to encapsulate and add new logic. Also enables strict mode.
84 lines
2.0 KiB
JavaScript
84 lines
2.0 KiB
JavaScript
// Test update modifier uassert during initial sync. SERVER-4781
|
|
|
|
load("jstests/replsets/rslib.js");
|
|
basename = "jstests_initsync4";
|
|
|
|
print("1. Bring up set");
|
|
replTest = new ReplSetTest( {name: basename, nodes: 1} );
|
|
replTest.startSet();
|
|
replTest.initiate();
|
|
|
|
m = replTest.getPrimary();
|
|
md = m.getDB("d");
|
|
mc = m.getDB("d")["c"];
|
|
|
|
print("2. Insert some data");
|
|
N = 5000;
|
|
mc.ensureIndex({x:1});
|
|
var bulk = mc.initializeUnorderedBulkOp();
|
|
for( i = 0; i < N; ++i ) {
|
|
bulk.insert({ _id: i, x: i, a: {} });
|
|
}
|
|
assert.writeOK(bulk.execute());
|
|
|
|
print("3. Make sure synced");
|
|
replTest.awaitReplication();
|
|
|
|
print("4. Bring up a new node");
|
|
hostname = getHostName();
|
|
|
|
s = MongoRunner.runMongod({replSet: basename, oplogSize: 2});
|
|
|
|
var config = replTest.getReplSetConfig();
|
|
config.version = 2;
|
|
config.members.push({_id:2, host:hostname+":"+s.port});
|
|
try {
|
|
m.getDB("admin").runCommand({replSetReconfig:config});
|
|
}
|
|
catch(e) {
|
|
print(e);
|
|
}
|
|
reconnect(s);
|
|
|
|
print("5. Wait for new node to start cloning");
|
|
|
|
s.setSlaveOk();
|
|
sc = s.getDB("d")["c"];
|
|
|
|
wait( function() { printjson( sc.stats() ); return sc.stats().count > 0; } );
|
|
|
|
print("6. Start updating documents on primary");
|
|
for( i = N-1; i >= N-10000; --i ) {
|
|
// If the document is cloned as {a:1}, the {$set:{'a.b':1}} modifier will uassert.
|
|
mc.update( {_id:i}, {$set:{'a.b':1}} );
|
|
mc.update( {_id:i}, {$set:{a:1}} );
|
|
}
|
|
|
|
for ( i = N; i < N*2; i++ ) {
|
|
mc.insert( { _id : i, x : i } )
|
|
}
|
|
|
|
assert.eq( N*2, mc.count() );
|
|
|
|
print("7. Wait for new node to become SECONDARY");
|
|
wait(function() {
|
|
var status = s.getDB("admin").runCommand({replSetGetStatus:1});
|
|
printjson(status);
|
|
return status.members &&
|
|
(status.members[1].state == 2);
|
|
});
|
|
|
|
print("8. Wait for new node to have all the data")
|
|
wait(function() {
|
|
return sc.count() == mc.count();
|
|
} );
|
|
|
|
|
|
assert.eq( mc.getIndexKeys().length,
|
|
sc.getIndexKeys().length );
|
|
|
|
assert.eq( mc.find().sort( { x : 1 } ).itcount(),
|
|
sc.find().sort( { x : 1 } ).itcount() );
|
|
|
|
replTest.stopSet( 15 );
|