0
0
mirror of https://github.com/mongodb/mongo.git synced 2024-11-25 09:19:32 +01:00
mongodb/jstests/noPassthrough/wt_index_option_defaults.js
Alex Gorrod 08d29c3640 SERVER-28572
Change a js test because WiredTiger is changing the range of values possible for split_pct
which this test happens to use as a way to test custom configuration visibility.
2017-04-01 07:08:44 +11:00

159 lines
7.3 KiB
JavaScript

/**
* Tests that different values for the same configuration string key have the following order of
* preference:
* 1. index-specific options specified to createIndex().
* 2. collection-wide options specified as "indexOptionDefaults" to createCollection().
* 3. system-wide options specified by --wiredTigerIndexConfigString or by
* inMemoryIndexConfigString.
*/
(function() {
'use strict';
var engine = 'wiredTiger';
if (jsTest.options().storageEngine) {
engine = jsTest.options().storageEngine;
}
// Skip this test if not running with the right storage engine.
if (engine !== 'wiredTiger' && engine !== 'inMemory') {
jsTest.log('Skipping test because storageEngine is not "wiredTiger" or "inMemory"');
return;
}
// Skip this test when 'xxxIndexConfigString' is already set in TestData.
// TODO: This test can be enabled when MongoRunner supports combining WT config strings with
// commas.
if (jsTest.options()[engine + 'IndexConfigString']) {
jsTest.log('Skipping test because system-wide defaults for index options are already set');
return;
}
// Use different values for the same configuration string key to test that index-specific
// options override collection-wide options, and that collection-wide options override
// system-wide options.
var systemWideConfigString = 'split_pct=70,';
var collectionWideConfigString = 'split_pct=75,';
var indexSpecificConfigString = 'split_pct=80,';
// Start up a mongod with system-wide defaults for index options and create a collection without
// any additional options. Tests than an index without any additional options should take on the
// system-wide defaults, whereas an index with additional options should override the
// system-wide defaults.
runTest({});
// Start up a mongod with system-wide defaults for index options and create a collection with
// additional options. Tests than an index without any additional options should take on the
// collection-wide defaults, whereas an index with additional options should override the
// collection-wide defaults.
runTest({indexOptionDefaults: collectionWideConfigString});
function runTest(collOptions) {
var hasIndexOptionDefaults = collOptions.hasOwnProperty('indexOptionDefaults');
var dbpath = MongoRunner.dataPath + 'wt_index_option_defaults';
resetDbpath(dbpath);
// Start a mongod with system-wide defaults for engine-specific index options.
var conn = MongoRunner.runMongod({
dbpath: dbpath,
noCleanData: true,
[engine + 'IndexConfigString']: systemWideConfigString,
});
assert.neq(null, conn, 'mongod was unable to start up');
var testDB = conn.getDB('test');
var cmdObj = {create: 'coll'};
// Apply collection-wide defaults for engine-specific index options if any were
// specified.
if (hasIndexOptionDefaults) {
cmdObj.indexOptionDefaults = {
storageEngine: {[engine]: {configString: collOptions.indexOptionDefaults}}
};
}
assert.commandWorked(testDB.runCommand(cmdObj));
// Create an index that does not specify any engine-specific options.
assert.commandWorked(testDB.coll.createIndex({a: 1}, {name: 'without_options'}));
// Create an index that specifies engine-specific index options.
assert.commandWorked(testDB.coll.createIndex({b: 1}, {
name: 'with_options',
storageEngine: {[engine]: {configString: indexSpecificConfigString}}
}));
var collStats = testDB.runCommand({collStats: 'coll'});
assert.commandWorked(collStats);
checkIndexWithoutOptions(collStats.indexDetails);
checkIndexWithOptions(collStats.indexDetails);
MongoRunner.stopMongod(conn);
function checkIndexWithoutOptions(indexDetails) {
var indexSpec = getIndexSpecByName(testDB.coll, 'without_options');
assert(!indexSpec.hasOwnProperty('storageEngine'),
'no storage engine options should have been set in the index spec: ' +
tojson(indexSpec));
var creationString = indexDetails.without_options.creationString;
if (hasIndexOptionDefaults) {
assert.eq(-1,
creationString.indexOf(systemWideConfigString),
'system-wide index option present in the creation string even though a ' +
'collection-wide option was specified: ' + creationString);
assert.lte(0,
creationString.indexOf(collectionWideConfigString),
'collection-wide index option not present in the creation string: ' +
creationString);
} else {
assert.lte(0,
creationString.indexOf(systemWideConfigString),
'system-wide index option not present in the creation string: ' +
creationString);
assert.eq(-1,
creationString.indexOf(collectionWideConfigString),
'collection-wide index option present in creation string even though ' +
'it was not specified: ' + creationString);
}
assert.eq(-1,
creationString.indexOf(indexSpecificConfigString),
'index-specific option present in creation string even though it was not' +
' specified: ' + creationString);
}
function checkIndexWithOptions(indexDetails) {
var indexSpec = getIndexSpecByName(testDB.coll, 'with_options');
assert(indexSpec.hasOwnProperty('storageEngine'),
'storage engine options should have been set in the index spec: ' +
tojson(indexSpec));
assert.docEq({[engine]: {configString: indexSpecificConfigString}},
indexSpec.storageEngine,
engine + ' index options not present in the index spec');
var creationString = indexDetails.with_options.creationString;
assert.eq(-1,
creationString.indexOf(systemWideConfigString),
'system-wide index option present in the creation string even though an ' +
'index-specific option was specified: ' + creationString);
assert.eq(-1,
creationString.indexOf(collectionWideConfigString),
'system-wide index option present in the creation string even though an ' +
'index-specific option was specified: ' + creationString);
assert.lte(
0,
creationString.indexOf(indexSpecificConfigString),
'index-specific option not present in the creation string: ' + creationString);
}
}
function getIndexSpecByName(coll, indexName) {
var indexes = coll.getIndexes().filter(function(spec) {
return spec.name === indexName;
});
assert.eq(1, indexes.length, 'index "' + indexName + '" not found');
return indexes[0];
}
})();