diff options
Diffstat (limited to 'jstests/replsets/resync_with_write_load.js')
| -rw-r--r-- | jstests/replsets/resync_with_write_load.js | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/jstests/replsets/resync_with_write_load.js b/jstests/replsets/resync_with_write_load.js new file mode 100644 index 00000000000..9fe82b62fb7 --- /dev/null +++ b/jstests/replsets/resync_with_write_load.js @@ -0,0 +1,104 @@ +/** + * This test creates a 2 node replica set and then puts load on the primary with writes during + * the resync in order to verify that all phases of the initial sync work correctly. + * + * We cannot test each phase of the initial sync directly but by providing constant writes we can + * assume that each individual phase will have data to work with, and therefore tested. + */ +var testName = "resync_with_write_load" +var replTest = new ReplSetTest({name: testName, nodes: 3, oplogSize: 100}); +var nodes = replTest.nodeList(); + +var conns = replTest.startSet(); +var config = { "_id": testName, + "members": [ + {"_id": 0, "host": nodes[0], priority:4}, + {"_id": 1, "host": nodes[1]}, + {"_id": 2, "host": nodes[2]}] + }; +var r = replTest.initiate(config); + +// Make sure we have a master +var master = replTest.getMaster(); +var a_conn = conns[0]; +var b_conn = conns[1]; +a_conn.setSlaveOk(); +b_conn.setSlaveOk(); +var A = a_conn.getDB("test"); +var B = b_conn.getDB("test"); +var AID = replTest.getNodeId(a_conn); +var BID = replTest.getNodeId(b_conn); +assert(master == conns[0], "conns[0] assumed to be master"); +assert(a_conn.host == master.host); + +// create an oplog entry with an insert +assert.writeOK( A.foo.insert({ x: 1 }, { writeConcern: { w: 1, wtimeout: 60000 }})); +replTest.stop(BID); + +print("******************** starting load for 30 secs *********************"); +var work = function() { + print("starting loadgen"); + var start=new Date().getTime(); + + assert.writeOK(db.timeToStartTrigger.insert({_id:1})); + + while (true) { + for (x=0; x < 100; x++) { + db["a" + x].insert({a:x}); + }; + + var runTime = (new Date().getTime() - start); + if (runTime > 30000) + break; + else if (runTime < 5000) // back-off more during first 2 seconds + sleep(50); + else + sleep(1); + + }; + print("finshing loadgen"); + }; +//insert enough that resync node has to go through oplog replay in each step +var loadGen = startParallelShell(work, replTest.ports[0]); + +// wait for document to appear to continue +assert.soon(function() { + try { + return 1 == master.getDB("test")["timeToStartTrigger"].count(); + } catch ( e ) { + print( e ); + return false; + } +}, "waited too long for start trigger", 90 * 1000 /* 90 secs */ ); + +print("*************** STARTING node without data ***************"); +replTest.start(BID); +// check that it is up +assert.soon(function() { + try { + var result = b_conn.getDB("admin").runCommand({replSetGetStatus: 1}); + return true; + } catch ( e ) { + print( e ); + return false; + } +}, "node didn't come up"); + +print("waiting for load generation to finish"); +loadGen(); + +// load must stop before we await replication. +replTest.awaitReplication(); + +// Make sure oplogs match +try { + replTest.ensureOplogsMatch(); +} catch (e) { + var aDBHash = A.runCommand("dbhash"); + var bDBHash = B.runCommand("dbhash"); + assert.eq(aDBHash.md5, bDBHash.md5, + "hashes differ: " + tojson(aDBHash) + " to " + tojson(bDBHash)); +} +replTest.stopSet(); + +print("*****test done******"); |
