summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jstests/sharding/stats.js76
-rw-r--r--src/mongo/shell/collection.js6
2 files changed, 79 insertions, 3 deletions
diff --git a/jstests/sharding/stats.js b/jstests/sharding/stats.js
index 8aa3ae0f3c5..41fa2534cf7 100644
--- a/jstests/sharding/stats.js
+++ b/jstests/sharding/stats.js
@@ -13,6 +13,10 @@ function numKeys(o){
return num;
}
+db.foo.drop();
+assert.commandFailed(db.foo.stats(),
+ 'db.collection.stats() should fail on non-existent collection');
+
// ---------- load some data -----
// need collections sharded before and after main collection for proper test
@@ -40,6 +44,10 @@ assert.eq( N / 2 , x.shards.shard0000.count , "coll count on shard0000 expected"
assert.eq( N / 2 , x.shards.shard0001.count , "coll count on shard0001 expected" )
assert.eq( a.foo.count() , x.shards.shard0000.count , "coll count on shard0000 match" )
assert.eq( b.foo.count() , x.shards.shard0001.count , "coll count on shard0001 match" )
+assert(!x.shards.shard0000.indexDetails,
+ 'indexDetails should not be present in shard0000: ' + tojson(x.shards.shard0000));
+assert(!x.shards.shard0001.indexDetails,
+ 'indexDetails should not be present in shard0001: ' + tojson(x.shards.shard0001));
a_extras = a.stats().objects - a.foo.count(); // things like system.namespaces and system.indexes
@@ -108,12 +116,74 @@ coll_not_scaled = db.foo.stats();
coll_scaled_512 = db.foo.stats(512);
coll_scaled_1024 = db.foo.stats(1024);
-for (var shard in coll_not_scaled.raw) {
- collStatComp(coll_not_scaled.raw[shard], coll_scaled_512.raw[shard], 512, false);
- collStatComp(coll_not_scaled.raw[shard], coll_scaled_1024.raw[shard], 1024, false);
+for (var shard in coll_not_scaled.shards) {
+ collStatComp(coll_not_scaled.shards[shard], coll_scaled_512.shards[shard], 512, false);
+ collStatComp(coll_not_scaled.shards[shard], coll_scaled_1024.shards[shard], 1024, false);
}
collStatComp(coll_not_scaled, coll_scaled_512, 512, true);
collStatComp(coll_not_scaled, coll_scaled_1024, 1024, true);
+/* db.collection.stats() - indexDetails tests */
+(function() {
+ var t = db.foo;
+
+ assert.commandWorked(t.ensureIndex({a: 1}));
+ assert.eq(2, t.getIndexes().length);
+
+ var isWiredTiger = (jsTest.options().storageEngine == "wiredTiger");
+
+ var stats = assert.commandWorked(t.stats({indexDetails: true}));
+ var shardName;
+ var shardStats;
+ for (shardName in stats.shards) {
+ shardStats = stats.shards[shardName];
+ assert(shardStats.indexDetails,
+ 'indexDetails missing for ' + shardName + ': ' + tojson(shardStats));
+ if (isWiredTiger) {
+ assert.eq(t.getIndexes().length, Object.keys(shardStats.indexDetails).length,
+ 'incorrect number of entries in WiredTiger indexDetails: ' +
+ tojson(shardStats));
+ }
+ }
+
+ function getIndexName(indexKey) {
+ var indexes = t.getIndexes().filter(function(doc) {
+ return friendlyEqual(doc.key, indexKey);
+ });
+ assert.eq(1, indexes.length, tojson(indexKey) + ' not found in getIndexes() result: ' +
+ tojson(t.getIndexes()));
+ return indexes[0].name;
+ }
+
+ function checkIndexDetails(options, indexName) {
+ var stats = assert.commandWorked(t.stats(options));
+ for (shardName in stats.shards) {
+ shardStats = stats.shards[shardName];
+ assert(shardStats.indexDetails,
+ 'indexDetails missing from db.collection.stats(' + tojson(options) +
+ ').shards[' + shardName + '] result: ' + tojson(shardStats));
+ // Currently, indexDetails is only supported with WiredTiger.
+ if (isWiredTiger) {
+ assert.eq(1, Object.keys(shardStats.indexDetails).length,
+ 'WiredTiger indexDetails must have exactly one entry');
+ assert(shardStats.indexDetails[indexName],
+ indexName + ' missing from WiredTiger indexDetails: ' +
+ tojson(shardStats.indexDetails));
+ assert.neq(0, Object.keys(shardStats.indexDetails[indexName]).length,
+ indexName + ' exists in indexDetails but contains no information: ' +
+ tojson(shardStats.indexDetails));
+ }
+ }
+ }
+
+ // indexDetailsKey - show indexDetails results for this index key only.
+ var indexKey = {a: 1};
+ var indexName = getIndexName(indexKey);
+ checkIndexDetails({indexDetails: true, indexDetailsKey: indexKey}, indexName);
+
+ // indexDetailsName - show indexDetails results for this index name only.
+ checkIndexDetails({indexDetails: true, indexDetailsName: indexName}, indexName);
+}());
+
s.stop()
diff --git a/src/mongo/shell/collection.js b/src/mongo/shell/collection.js
index 2b9f0e84beb..4bcffbc1364 100644
--- a/src/mongo/shell/collection.js
+++ b/src/mongo/shell/collection.js
@@ -1151,6 +1151,12 @@ DBCollection.prototype.stats = function(args) {
updateStats(res, options.indexDetails, filterIndexName);
+ if (res.sharded) {
+ for (var shardName in res.shards) {
+ updateStats(res.shards[shardName], options.indexDetails, filterIndexName);
+ }
+ }
+
return res;
}