summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Hernandez <scotthernandez@gmail.com>2014-09-29 08:25:36 -0400
committerScott Hernandez <scotthernandez@gmail.com>2014-09-29 14:55:05 -0400
commite5de9146a0bcdd160661766cb168cb7530759444 (patch)
treef724e1779aabbc96d2f45056c853e67df760aeca
parent243f11cd82d7925c77df0b04fad58b18f70cf031 (diff)
downloadmongo-e5de9146a0bcdd160661766cb168cb7530759444.tar.gz
backport resync_with_write_load js test
-rw-r--r--jstests/replsets/resync_with_write_load.js36
-rw-r--r--src/mongo/shell/servers_misc.js11
2 files changed, 40 insertions, 7 deletions
diff --git a/jstests/replsets/resync_with_write_load.js b/jstests/replsets/resync_with_write_load.js
index aaf53c91dd8..9fe82b62fb7 100644
--- a/jstests/replsets/resync_with_write_load.js
+++ b/jstests/replsets/resync_with_write_load.js
@@ -5,14 +5,16 @@
* 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 replTest = new ReplSetTest({name: 'resync', nodes: 2, oplogSize: 100});
+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": "resync",
+var config = { "_id": testName,
"members": [
{"_id": 0, "host": nodes[0], priority:4},
- {"_id": 1, "host": nodes[1]}]
+ {"_id": 1, "host": nodes[1]},
+ {"_id": 2, "host": nodes[2]}]
};
var r = replTest.initiate(config);
@@ -34,20 +36,40 @@ assert.writeOK( A.foo.insert({ x: 1 }, { writeConcern: { w: 1, wtimeout: 60000 }
replTest.stop(BID);
print("******************** starting load for 30 secs *********************");
-var work = 'var start=new Date().getTime(); db.timeToStartTrigger.insert({_id:1}); while(true) {for(x=0;x<1000;x++) {db["a" + x].insert({a:x})};sleep(1); if((new Date().getTime() - start) > 30000) break; }';
+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] );
+var loadGen = startParallelShell(work, replTest.ports[0]);
// wait for document to appear to continue
assert.soon(function() {
try {
- return 1 == a_conn.getDB("test")["timeToStartTrigger"].count();
+ return 1 == master.getDB("test")["timeToStartTrigger"].count();
} catch ( e ) {
print( e );
return false;
}
-}, "waited too long for start trigger");
+}, "waited too long for start trigger", 90 * 1000 /* 90 secs */ );
print("*************** STARTING node without data ***************");
replTest.start(BID);
diff --git a/src/mongo/shell/servers_misc.js b/src/mongo/shell/servers_misc.js
index 91db127998a..52a2f3a9381 100644
--- a/src/mongo/shell/servers_misc.js
+++ b/src/mongo/shell/servers_misc.js
@@ -290,6 +290,17 @@ function startParallelShell( jsCode, port, noConnect ){
var args = ["mongo"];
+ // Convert function into call-string
+ if (typeof(jsCode) == "function") {
+ var id = Math.floor(Math.random() * 100000);
+ jsCode = "var f" + id + " = " + jsCode.toString() + ";f" + id + "();";
+ }
+ else if(typeof(jsCode) == "string") {}
+ // do nothing
+ else {
+ throw Error("bad first argument to startParallelShell");
+ }
+
if (noConnect) {
args.push("--nodb");
} else if (typeof(db) == "object") {