summaryrefslogtreecommitdiff
path: root/jstests/dur/dur2.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/dur/dur2.js')
-rw-r--r--jstests/dur/dur2.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/jstests/dur/dur2.js b/jstests/dur/dur2.js
new file mode 100644
index 0000000..dd0ab0f
--- /dev/null
+++ b/jstests/dur/dur2.js
@@ -0,0 +1,92 @@
+/* test durability
+ runs mongod, kill -9's, recovers
+*/
+
+var debugging = false;
+var testname = "dur2";
+var step = 1;
+var conn = null;
+
+var start = new Date();
+function howLongSecs() {
+ return (new Date() - start) / 1000;
+}
+
+function log(str) {
+ if(str)
+ print("\n" + testname+" step " + step++ + " " + str);
+ else
+ print(testname+" step " + step++);
+}
+
+function verify() {
+ log("verify");
+ var d = conn.getDB("test");
+ var mycount = d.foo.count();
+ //print("count:" + mycount);
+ assert(mycount>2, "count wrong");
+}
+
+function work() {
+ log("work");
+ x = 'x'; while(x.length < 1024) x+=x;
+ var d = conn.getDB("test");
+ d.foo.drop();
+ d.foo.insert({});
+
+ // go long enough we will have time to kill it later during recovery
+ var j = 2;
+ var MaxTime = 15;
+ if (Math.random() < 0.1) {
+ print("dur2.js DOING A LONGER (120 sec) PASS - if an error, try long pass to replicate");
+ MaxTime = 120;
+ }
+ while (1) {
+ d.foo.insert({ _id: j, z: x });
+ d.foo.update({ _id: j }, { $inc: { a: 1} });
+ if (j % 25 == 0)
+ d.foo.remove({ _id: j });
+ j++;
+ if( j % 3 == 0 )
+ d.foo.update({ _id: j }, { $inc: { a: 1} }, true);
+ if (j % 10000 == 0)
+ print(j);
+ if (howLongSecs() > MaxTime)
+ break;
+ }
+
+ verify();
+ d.runCommand({ getLastError: 1, fsync: 1 });
+}
+
+if( debugging ) {
+ // mongod already running in debugger
+ print("DOING DEBUG MODE BEHAVIOR AS 'db' IS DEFINED -- RUN mongo --nodb FOR REGULAR TEST BEHAVIOR");
+ conn = db.getMongo();
+ work();
+ sleep(30000);
+ quit();
+}
+
+// directories
+var path = "/data/db/" + testname+"dur";
+
+log("run mongod with --dur");
+conn = startMongodEmpty("--port", 30001, "--dbpath", path, "--dur", "--smallfiles", "--durOptions", /*DurParanoid*/8, "--master", "--oplogSize", 64);
+work();
+
+log("kill -9");
+stopMongod(30001, /*signal*/9);
+
+// journal file should be present, and non-empty as we killed hard
+assert(listFiles(path + "/journal/").length > 0, "journal directory is unexpectantly empty after kill");
+
+// restart and recover
+log("restart mongod and recover");
+conn = startMongodNoReset("--port", 30002, "--dbpath", path, "--dur", "--smallfiles", "--durOptions", 8, "--master", "--oplogSize", 64);
+verify();
+
+log("stopping mongod 30002");
+stopMongod(30002);
+
+print(testname + " SUCCESS");