156 lines
4.5 KiB
JavaScript
Executable File
156 lines
4.5 KiB
JavaScript
Executable File
/* quick.js
|
|
test durability
|
|
this file should always run quickly
|
|
other tests can be slow
|
|
*/
|
|
|
|
testname = "a_quick";
|
|
tst = {}
|
|
|
|
tst.log = function (optional_msg) {
|
|
print("\n\nstep " + ++this._step + " " + (optional_msg || ""));
|
|
}
|
|
|
|
tst.success = function () {
|
|
print(testname + " SUCCESS");
|
|
}
|
|
|
|
/* diff files a and b, returning the difference (empty str if no difference) */
|
|
tst.diff = function(a, b) {
|
|
function reSlash(s) {
|
|
var x = s;
|
|
if (_isWindows()) {
|
|
while (1) {
|
|
var y = x.replace('/', '\\');
|
|
if (y == x)
|
|
break;
|
|
x = y;
|
|
}
|
|
}
|
|
return x;
|
|
}
|
|
a = reSlash(a);
|
|
b = reSlash(b);
|
|
print("diff " + a + " " + b);
|
|
return run("diff", a, b);
|
|
}
|
|
print(testname + " BEGIN");
|
|
tst._step = 0;
|
|
|
|
function checkNoJournalFiles(path, pass) {
|
|
var files = listFiles(path);
|
|
if (files.some(function (f) { return f.name.indexOf("prealloc") < 0; })) {
|
|
if (pass == null) {
|
|
// wait a bit longer for mongod to potentially finish if it is still running.
|
|
sleep(10000);
|
|
return checkNoJournalFiles(path, 1);
|
|
}
|
|
print("\n\n\n");
|
|
print("FAIL path:" + path);
|
|
print("unexpected files:");
|
|
printjson(files);
|
|
assert(false, "FAIL a journal/lsn file is present which is unexpected");
|
|
}
|
|
}
|
|
|
|
// directories
|
|
var path1 = MongoRunner.dataDir + "/quicknodur";
|
|
var path2 = MongoRunner.dataDir + "/quickdur";
|
|
|
|
// non-durable version
|
|
tst.log("start mongod without dur");
|
|
var conn = MongoRunner.runMongod({dbpath: path1, nojournal: ""});
|
|
tst.log("without dur work");
|
|
var d = conn.getDB("test");
|
|
assert.writeOK(d.foo.insert({ _id: 123 }));
|
|
tst.log("stop without dur");
|
|
MongoRunner.stopMongod(conn);
|
|
|
|
// durable version
|
|
tst.log("start mongod with dur");
|
|
conn = MongoRunner.runMongod({dbpath: path2, journal: "", journalOptions: 8});
|
|
tst.log("with dur work");
|
|
d = conn.getDB("test");
|
|
assert.writeOK(d.foo.insert({ _id: 123 }));
|
|
|
|
// we could actually do getlasterror fsync:1 now, but maybe this is agood
|
|
// as it will assure that commits happen on a timely basis. a bunch of the other dur/*js
|
|
// tests use fsync
|
|
tst.log("sleep a bit for a group commit");
|
|
sleep(8000);
|
|
|
|
// kill the process hard
|
|
tst.log("kill -9 mongod");
|
|
MongoRunner.stopMongod(conn.port, /*signal*/9);
|
|
|
|
// journal file should be present, and non-empty as we killed hard
|
|
|
|
// we will force removal of a datafile to be sure we can recreate everything
|
|
// without it being present.
|
|
removeFile(path2 + "/test.0");
|
|
|
|
// for that to work, we can't skip anything though:
|
|
removeFile(path2 + "/journal/lsn");
|
|
|
|
// with the file deleted, we MUST start from the beginning of the journal.
|
|
// thus this check to be careful
|
|
var files = listFiles(path2 + "/journal/");
|
|
if (files.some(function (f) { return f.name.indexOf("lsn") >= 0; })) {
|
|
print("\n\n\n");
|
|
print(path2);
|
|
printjson(files);
|
|
assert(false, "a journal/lsn file is present which will make this test potentially fail.");
|
|
}
|
|
|
|
// restart and recover
|
|
tst.log("restart and recover");
|
|
conn = MongoRunner.runMongod({restart: true,
|
|
cleanData: false,
|
|
dbpath: path2,
|
|
journal: "",
|
|
journalOptions: 9});
|
|
tst.log("check data results");
|
|
d = conn.getDB("test");
|
|
|
|
var countOk = (d.foo.count() == 1);
|
|
if (!countOk) {
|
|
print("\n\n\na_quick.js FAIL count " + d.foo.count() + " is wrong\n\n\n");
|
|
// keep going - want to see if the diff matches. if so the sleep() above was too short?
|
|
}
|
|
|
|
tst.log("stop");
|
|
MongoRunner.stopMongod(conn);
|
|
|
|
// at this point, after clean shutdown, there should be no journal files
|
|
tst.log("check no journal files");
|
|
checkNoJournalFiles(path2 + "/journal");
|
|
|
|
tst.log("check data matches");
|
|
var diff = tst.diff(path1 + "/test.ns", path2 + "/test.ns");
|
|
print("diff of .ns files returns:" + diff);
|
|
|
|
function showfiles() {
|
|
print("\n\nERROR: files for dur and nodur do not match");
|
|
print(path1 + " files:");
|
|
printjson(listFiles(path1));
|
|
print(path2 + " files:");
|
|
printjson(listFiles(path2));
|
|
print();
|
|
}
|
|
|
|
if (diff != "") {
|
|
showfiles();
|
|
assert(diff == "", "error test.ns files differ");
|
|
}
|
|
|
|
diff = tst.diff(path1 + "/test.0", path2 + "/test.0");
|
|
print("diff of .0 files returns:" + diff);
|
|
if (diff != "") {
|
|
showfiles();
|
|
assert(diff == "", "error test.0 files differ");
|
|
}
|
|
|
|
assert(countOk, "a_quick.js document count after recovery was not the expected value");
|
|
|
|
tst.success();
|