1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
var baseDir = "jstests_disk_directoryper";
var baseName = "directoryperdb";
var dbpath = MongoRunner.dataPath + baseDir + "/";
var storageEngine = db.serverStatus().storageEngine.name;
// The pattern which matches the names of database files
var dbFileMatcher;
if (storageEngine == "mmapv1") {
// Matches mmapv1 *.ns and *.0, *.1, etc files.
dbFileMatcher = /\.(ns|\d+)$/;
} else if (storageEngine == "wiredTiger") {
// Matches wiredTiger collection-*.wt and index-*.wt files
dbFileMatcher = /(collection|index)-.+\.wt$/;
} else {
assert(false, "This test must be run against mmapv1 or wiredTiger");
}
// Set up helper functions.
assertDocumentCount = function(db, count) {
assert.eq(count,
db[baseName].count(),
"Expected " + count + " documents in " + db._name + "." + baseName + ". " +
"Found: " + tojson(db[baseName].find().toArray()));
};
checkDBFilesInDBDirectory = function(db) {
db.adminCommand({fsync: 1});
var dir = dbpath + db._name;
files = listFiles(dir);
var fileCount = 0;
for (f in files) {
if (files[f].isDirectory)
continue;
fileCount += 1;
assert(dbFileMatcher.test(files[f].name),
"In directory:" + dir + " found unexpected file: " + files[f].name);
}
assert(fileCount > 0, "Expected more than zero nondirectory files in database directory");
};
checkDBDirectoryNonexistent = function(db) {
db.adminCommand({fsync: 1});
var files = listFiles(dbpath);
// Check that there are no files in the toplevel dbpath.
for (f in files) {
if (!files[f].isDirectory) {
assert(!dbFileMatcher.test(files[f].name),
"Database file" + files[f].name +
" exists in dbpath after deleting all non-directoryperdb databases");
}
}
// Check db directories to ensure db files in them have been destroyed.
// mmapv1 removes the database directory, pending SERVER-1379.
if (storageEngine == "mmapv1") {
var files = listFiles(dbpath);
var fileNotFound = true;
for (f in files) {
assert(files[f].name != db._name, "Directory " + db._name + " still exists");
}
} else if (storageEngine == "wiredTiger") {
var files = listFiles(dbpath + db._name);
assert.eq(files.length, 0, "Files left behind in database directory");
}
};
// Start the directoryperdb instance of mongod.
var m = MongoRunner.runMongod({storageEngine: storageEngine, dbpath: dbpath, directoryperdb: ""});
// Check that the 'local' db has allocated data.
var localDb = m.getDB("local");
checkDBFilesInDBDirectory(localDb);
// Create database with directoryperdb.
var dbBase = m.getDB(baseName);
dbBase[baseName].insert({});
assertDocumentCount(dbBase, 1);
checkDBFilesInDBDirectory(dbBase);
// Drop a database created with directoryperdb.
assert.commandWorked(dbBase.runCommand({dropDatabase: 1}));
assertDocumentCount(dbBase, 0);
checkDBDirectoryNonexistent(dbBase);
// It should be impossible to create a database named "journal" with directoryperdb, as that
// directory exists. This test has been disabled until SERVER-2460 is resolved.
/*
db = m.getDB( "journal" );
assert.writeError(db[ "journal" ].insert( {} ));
*/
// Using WiredTiger, it should be impossible to create a database named "WiredTiger" with
// directoryperdb, as that file is created by the WiredTiger storageEngine.
if (storageEngine == "wiredTiger") {
var dbW = m.getDB("WiredTiger");
assert.writeError(dbW[baseName].insert({}));
}
// Create a database named 'a' repeated 63 times.
var dbNameAA = Array(64).join('a');
var dbAA = m.getDB(dbNameAA);
assert.writeOK(dbAA[baseName].insert({}));
assertDocumentCount(dbAA, 1);
checkDBFilesInDBDirectory(dbAA);
// Create a database named '&'.
var dbAnd = m.getDB('&');
assert.writeOK(dbAnd[baseName].insert({}));
assertDocumentCount(dbAnd, 1);
checkDBFilesInDBDirectory(dbAnd);
// Unicode directoryperdb databases do not work on Windows.
// Disabled until https://jira.mongodb.org/browse/SERVER-16725
// is resolved.
if (!_isWindows()) {
// Create a database named '処'.
var dbNameU = '処';
var dbU = m.getDB(dbNameU);
assert.writeOK(dbU[baseName].insert({}));
assertDocumentCount(dbU, 1);
checkDBFilesInDBDirectory(dbU);
// Create a database named '処' repeated 21 times.
var dbNameUU = Array(22).join('処');
var dbUU = m.getDB(dbNameUU);
assert.writeOK(dbUU[baseName].insert({}));
assertDocumentCount(dbUU, 1);
checkDBFilesInDBDirectory(dbUU);
}
print("SUCCESS directoryperdb.js");
|