0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-12-01 09:32:32 +01:00
mongodb/jstests/disk/directoryperdb.js

140 lines
4.8 KiB
JavaScript

var baseDir = "jstests_disk_directoryper";
var baseName = "directoryperdb"
port = allocatePorts( 1 )[ 0 ];
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");