diff options
author | Andrea Lattuada <andrea.lattuada@10gen.com> | 2012-11-15 17:10:39 -0500 |
---|---|---|
committer | Andrea Lattuada <andrea.lattuada@10gen.com> | 2012-11-15 17:39:03 -0500 |
commit | 97e0f2e4d8a865ee72aea03d86bf8c4aec067f71 (patch) | |
tree | 72a7491d21c6273c9589070883a279900054b5eb /jstests/storageDetailsCommand.js | |
parent | 9eb6b3a6a83164f20603317fa05e13ecb689e95b (diff) | |
download | mongo-97e0f2e4d8a865ee72aea03d86bf8c4aec067f71.tar.gz |
SERVER-7593 new command aggregates statistics related to the storage layout of a collection
Diffstat (limited to 'jstests/storageDetailsCommand.js')
-rw-r--r-- | jstests/storageDetailsCommand.js | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/jstests/storageDetailsCommand.js b/jstests/storageDetailsCommand.js new file mode 100644 index 00000000000..1340a1038d5 --- /dev/null +++ b/jstests/storageDetailsCommand.js @@ -0,0 +1,98 @@ +db.jstests_commands.drop(); +db.createCollection("jstests_commands"); + +t = db.jstests_commands; + +for (var i = 0; i < 3000; ++i) { + t.insert({i: i, d: i % 13}); +} + +function test() { + var result = t.diskStorageStats({numberOfSlices: 100}); + if (result["bad cmd"]) { + print("storageDetails command not available: skipping"); + return; + } + + assert.commandWorked(result); + + function checkDiskStats(data) { + assert(isNumber(data.extentHeaderBytes)); + assert(isNumber(data.recordHeaderBytes)); + assert(isNumber(data.numEntries)); + assert(data.bsonBytes instanceof NumberLong); + assert(data.recBytes instanceof NumberLong); + assert(data.onDiskBytes instanceof NumberLong); + assert(isNumber(data.outOfOrderRecs)); + assert(isNumber(data.characteristicCount)); + assert(isNumber(data.characteristicAvg)); + assert(data.freeRecsPerBucket instanceof Array); + } + + assert(result.extents && result.extents instanceof Array); + + var extents = result.extents; + + for (var i = 0; i < extents.length; ++i) { + assert(isObject(extents[i])); + assert.neq(extents[i], null); + assert(extents[i].range instanceof Array); + assert.eq(extents[i].range.length, 2); + assert.eq(extents[i].isCapped, false); + checkDiskStats(extents[i]); + assert(extents[i].slices instanceof Array); + for (var c = 0; c < extents[i].slices[c]; ++c) { + assert(isObject(extents[i].slices[c])); + assert.neq(extents[i].slices[c], null); + checkStats(extents[i].slices[c]); + } + } + + result = t.pagesInRAM({numberOfSlices: 100}); + assert(result.ok); + + assert(result.extents instanceof Array); + var extents = result.extents; + + for (var i = 0; i < result.extents.length; ++i) { + assert(isObject(extents[i])); + assert.neq(extents[i], null); + assert(isNumber(extents[i].pageBytes)); + assert(isNumber(extents[i].onDiskBytes)); + assert(isNumber(extents[i].inMem)); + + assert(extents[i].slices instanceof Array); + for (var c = 0; c < extents[i].slices.length; ++c) { + assert(isNumber(extents[i].slices[c])); + } + } + + function checkErrorConditions(helper) { + var result = helper.apply(t, [{extent: 'a'}]); + assert.commandFailed(result); + assert(result.errmsg.match(/extent.*must be a number/)); + + result = helper.apply(t, [{range: [2, 4]}]); + assert.commandFailed(result); + assert(result.errmsg.match(/range is only allowed.*extent/)); + + result = helper.apply(t, [{extent: 3, range: [3, 'a']}]); + assert.commandFailed(result); + assert(result.errmsg.match(/must be an array.*numeric elements/)); + + result = helper.apply(t, [{granularity: 'a'}]); + assert.commandFailed(result); + assert(result.errmsg.match(/granularity.*number/)); + + result = helper.apply(t, [{numberOfSlices: 'a'}]); + assert.commandFailed(result); + assert(result.errmsg.match(/numberOfSlices.*number/)); + + result = helper.apply(t, [{extent: 100}]); + assert.commandFailed(result); + assert(result.errmsg.match(/extent.*does not exist/)); + } + + checkErrorConditions(t.diskStorageStats); + checkErrorConditions(t.pagesInRAM); +} |