summaryrefslogtreecommitdiff
path: root/jstests/storageDetailsCommand.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/storageDetailsCommand.js')
-rw-r--r--jstests/storageDetailsCommand.js98
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);
+}