summaryrefslogtreecommitdiff
path: root/jstests/sharding/stats.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/sharding/stats.js')
-rw-r--r--jstests/sharding/stats.js421
1 files changed, 204 insertions, 217 deletions
diff --git a/jstests/sharding/stats.js b/jstests/sharding/stats.js
index f068269cfeb..0f0b77ac428 100644
--- a/jstests/sharding/stats.js
+++ b/jstests/sharding/stats.js
@@ -1,236 +1,223 @@
(function() {
- var s = new ShardingTest({name: "stats", shards: 2, mongos: 1});
-
- s.adminCommand({enablesharding: "test"});
-
- db = s.getDB("test");
- s.ensurePrimaryShard('test', s.shard1.shardName);
-
- function numKeys(o) {
- var num = 0;
- for (var x in o)
- num++;
- return num;
- }
-
- db.foo.drop();
- // SERVER-29678 changed collStats so versions > 4.0 now return 0s on NS not found
- if (MongoRunner.getBinVersionFor(jsTest.options().mongosBinVersion) === '4.0') {
- // TODO: This should be fixed in 4.4
- let res = db.foo.stats();
- if (res.ok === 1) {
- // Possible to hit a shard that is actually version >= 4.2 => result should be zeros
- assert(res.size === 0 && res.count === 0 && res.storageSize === 0 &&
- res.nindexes === 0);
- } else {
- assert.commandFailed(
- db.foo.stats(),
- 'db.collection.stats() should fail non-existent in versions <= 4.0');
- }
+var s = new ShardingTest({name: "stats", shards: 2, mongos: 1});
+
+s.adminCommand({enablesharding: "test"});
+
+db = s.getDB("test");
+s.ensurePrimaryShard('test', s.shard1.shardName);
+
+function numKeys(o) {
+ var num = 0;
+ for (var x in o)
+ num++;
+ return num;
+}
+
+db.foo.drop();
+// SERVER-29678 changed collStats so versions > 4.0 now return 0s on NS not found
+if (MongoRunner.getBinVersionFor(jsTest.options().mongosBinVersion) === '4.0') {
+ // TODO: This should be fixed in 4.4
+ let res = db.foo.stats();
+ if (res.ok === 1) {
+ // Possible to hit a shard that is actually version >= 4.2 => result should be zeros
+ assert(res.size === 0 && res.count === 0 && res.storageSize === 0 && res.nindexes === 0);
} else {
- assert.commandWorked(db.foo.stats(),
- 'db.collection.stats() should return 0s on non-existent collection');
+ assert.commandFailed(db.foo.stats(),
+ 'db.collection.stats() should fail non-existent in versions <= 4.0');
}
-
- // ---------- load some data -----
-
- // need collections sharded before and after main collection for proper test
- s.adminCommand({shardcollection: "test.aaa", key: {_id: 1}});
- s.adminCommand(
- {shardcollection: "test.foo", key: {_id: 1}}); // this collection is actually used
- s.adminCommand({shardcollection: "test.zzz", key: {_id: 1}});
-
- N = 10000;
- s.adminCommand({split: "test.foo", middle: {_id: N / 2}});
- s.adminCommand({
- moveChunk: "test.foo",
- find: {_id: 3},
- to: s.getNonPrimaries("test")[0],
- _waitForDelete: true
- });
-
- var bulk = db.foo.initializeUnorderedBulkOp();
- for (i = 0; i < N; i++)
- bulk.insert({_id: i});
- assert.writeOK(bulk.execute());
-
- // Flush all writes to disk since some of the stats are dependent on state in disk (like
- // totalIndexSize).
- assert.commandWorked(db.adminCommand({fsync: 1}));
-
- a = s.shard0.getDB("test");
- b = s.shard1.getDB("test");
-
- x = assert.commandWorked(db.foo.stats());
- assert.eq(N, x.count, "coll total count expected");
- assert.eq(db.foo.count(), x.count, "coll total count match");
- assert.eq(2, x.nchunks, "coll chunk num");
- assert.eq(2, numKeys(x.shards), "coll shard num");
- assert.eq(
- N / 2, x.shards[s.shard0.shardName].count, "coll count on s.shard0.shardName expected");
- assert.eq(
- N / 2, x.shards[s.shard1.shardName].count, "coll count on s.shard1.shardName expected");
- assert.eq(a.foo.count(),
- x.shards[s.shard0.shardName].count,
- "coll count on s.shard0.shardName match");
- assert.eq(b.foo.count(),
- x.shards[s.shard1.shardName].count,
- "coll count on s.shard1.shardName match");
- assert(!x.shards[s.shard0.shardName].indexDetails,
- 'indexDetails should not be present in s.shard0.shardName: ' +
- tojson(x.shards[s.shard0.shardName]));
- assert(!x.shards[s.shard1.shardName].indexDetails,
- 'indexDetails should not be present in s.shard1.shardName: ' +
- tojson(x.shards[s.shard1.shardName]));
-
- a_extras = a.stats().objects - a.foo.count();
- b_extras = b.stats().objects - b.foo.count();
- print("a_extras: " + a_extras);
- print("b_extras: " + b_extras);
-
- x = assert.commandWorked(db.stats());
-
- assert.eq(N + (a_extras + b_extras), x.objects, "db total count expected");
- assert.eq(2, numKeys(x.raw), "db shard num");
- assert.eq((N / 2) + a_extras,
- x.raw[s.shard0.name].objects,
- "db count on s.shard0.shardName expected");
- assert.eq((N / 2) + b_extras,
- x.raw[s.shard1.name].objects,
- "db count on s.shard1.shardName expected");
- assert.eq(
- a.stats().objects, x.raw[s.shard0.name].objects, "db count on s.shard0.shardName match");
- assert.eq(
- b.stats().objects, x.raw[s.shard1.name].objects, "db count on s.shard1.shardName match");
-
- /* Test db.stat() and db.collection.stat() scaling */
-
- /* Helper functions */
- function statComp(stat, stat_scaled, scale) {
- /* Because of loss of floating point precision, do not check exact equality */
- if (stat == stat_scaled)
- return true;
-
- var msg = 'scaled: ' + stat_scaled + ', stat: ' + stat + ', scale: ' + scale;
- assert.lte((stat_scaled - 2), (stat / scale), msg);
- assert.gte((stat_scaled + 2), (stat / scale), msg);
+} else {
+ assert.commandWorked(db.foo.stats(),
+ 'db.collection.stats() should return 0s on non-existent collection');
+}
+
+// ---------- load some data -----
+
+// need collections sharded before and after main collection for proper test
+s.adminCommand({shardcollection: "test.aaa", key: {_id: 1}});
+s.adminCommand({shardcollection: "test.foo", key: {_id: 1}}); // this collection is actually used
+s.adminCommand({shardcollection: "test.zzz", key: {_id: 1}});
+
+N = 10000;
+s.adminCommand({split: "test.foo", middle: {_id: N / 2}});
+s.adminCommand({
+ moveChunk: "test.foo",
+ find: {_id: 3},
+ to: s.getNonPrimaries("test")[0],
+ _waitForDelete: true
+});
+
+var bulk = db.foo.initializeUnorderedBulkOp();
+for (i = 0; i < N; i++)
+ bulk.insert({_id: i});
+assert.writeOK(bulk.execute());
+
+// Flush all writes to disk since some of the stats are dependent on state in disk (like
+// totalIndexSize).
+assert.commandWorked(db.adminCommand({fsync: 1}));
+
+a = s.shard0.getDB("test");
+b = s.shard1.getDB("test");
+
+x = assert.commandWorked(db.foo.stats());
+assert.eq(N, x.count, "coll total count expected");
+assert.eq(db.foo.count(), x.count, "coll total count match");
+assert.eq(2, x.nchunks, "coll chunk num");
+assert.eq(2, numKeys(x.shards), "coll shard num");
+assert.eq(N / 2, x.shards[s.shard0.shardName].count, "coll count on s.shard0.shardName expected");
+assert.eq(N / 2, x.shards[s.shard1.shardName].count, "coll count on s.shard1.shardName expected");
+assert.eq(
+ a.foo.count(), x.shards[s.shard0.shardName].count, "coll count on s.shard0.shardName match");
+assert.eq(
+ b.foo.count(), x.shards[s.shard1.shardName].count, "coll count on s.shard1.shardName match");
+assert(!x.shards[s.shard0.shardName].indexDetails,
+ 'indexDetails should not be present in s.shard0.shardName: ' +
+ tojson(x.shards[s.shard0.shardName]));
+assert(!x.shards[s.shard1.shardName].indexDetails,
+ 'indexDetails should not be present in s.shard1.shardName: ' +
+ tojson(x.shards[s.shard1.shardName]));
+
+a_extras = a.stats().objects - a.foo.count();
+b_extras = b.stats().objects - b.foo.count();
+print("a_extras: " + a_extras);
+print("b_extras: " + b_extras);
+
+x = assert.commandWorked(db.stats());
+
+assert.eq(N + (a_extras + b_extras), x.objects, "db total count expected");
+assert.eq(2, numKeys(x.raw), "db shard num");
+assert.eq(
+ (N / 2) + a_extras, x.raw[s.shard0.name].objects, "db count on s.shard0.shardName expected");
+assert.eq(
+ (N / 2) + b_extras, x.raw[s.shard1.name].objects, "db count on s.shard1.shardName expected");
+assert.eq(a.stats().objects, x.raw[s.shard0.name].objects, "db count on s.shard0.shardName match");
+assert.eq(b.stats().objects, x.raw[s.shard1.name].objects, "db count on s.shard1.shardName match");
+
+/* Test db.stat() and db.collection.stat() scaling */
+
+/* Helper functions */
+function statComp(stat, stat_scaled, scale) {
+ /* Because of loss of floating point precision, do not check exact equality */
+ if (stat == stat_scaled)
+ return true;
+
+ var msg = 'scaled: ' + stat_scaled + ', stat: ' + stat + ', scale: ' + scale;
+ assert.lte((stat_scaled - 2), (stat / scale), msg);
+ assert.gte((stat_scaled + 2), (stat / scale), msg);
+}
+
+function dbStatComp(stat_obj, stat_obj_scaled, scale) {
+ statComp(stat_obj.dataSize, stat_obj_scaled.dataSize, scale);
+ statComp(stat_obj.storageSize, stat_obj_scaled.storageSize, scale);
+ statComp(stat_obj.indexSize, stat_obj_scaled.indexSize, scale);
+ statComp(stat_obj.fileSize, stat_obj_scaled.fileSize, scale);
+ /* avgObjSize not scaled. See SERVER-7347 */
+ statComp(stat_obj.avgObjSize, stat_obj_scaled.avgObjSize, 1);
+}
+
+function collStatComp(stat_obj, stat_obj_scaled, scale, mongos) {
+ statComp(stat_obj.size, stat_obj_scaled.size, scale);
+ statComp(stat_obj.storageSize, stat_obj_scaled.storageSize, scale);
+ statComp(stat_obj.totalIndexSize, stat_obj_scaled.totalIndexSize, scale);
+ statComp(stat_obj.totalSize, stat_obj_scaled.totalSize, scale);
+ statComp(stat_obj.avgObjSize, stat_obj_scaled.avgObjSize, 1);
+ /* lastExtentSize doesn't exist in mongos level collection stats */
+ if (!mongos) {
+ statComp(stat_obj.lastExtentSize, stat_obj_scaled.lastExtentSize, scale);
}
+}
- function dbStatComp(stat_obj, stat_obj_scaled, scale) {
- statComp(stat_obj.dataSize, stat_obj_scaled.dataSize, scale);
- statComp(stat_obj.storageSize, stat_obj_scaled.storageSize, scale);
- statComp(stat_obj.indexSize, stat_obj_scaled.indexSize, scale);
- statComp(stat_obj.fileSize, stat_obj_scaled.fileSize, scale);
- /* avgObjSize not scaled. See SERVER-7347 */
- statComp(stat_obj.avgObjSize, stat_obj_scaled.avgObjSize, 1);
- }
+/* db.stats() tests */
+db_not_scaled = assert.commandWorked(db.stats());
+db_scaled_512 = assert.commandWorked(db.stats(512));
+db_scaled_1024 = assert.commandWorked(db.stats(1024));
- function collStatComp(stat_obj, stat_obj_scaled, scale, mongos) {
- statComp(stat_obj.size, stat_obj_scaled.size, scale);
- statComp(stat_obj.storageSize, stat_obj_scaled.storageSize, scale);
- statComp(stat_obj.totalIndexSize, stat_obj_scaled.totalIndexSize, scale);
- statComp(stat_obj.totalSize, stat_obj_scaled.totalSize, scale);
- statComp(stat_obj.avgObjSize, stat_obj_scaled.avgObjSize, 1);
- /* lastExtentSize doesn't exist in mongos level collection stats */
- if (!mongos) {
- statComp(stat_obj.lastExtentSize, stat_obj_scaled.lastExtentSize, scale);
- }
- }
+for (var shard in db_not_scaled.raw) {
+ dbStatComp(db_not_scaled.raw[shard], db_scaled_512.raw[shard], 512);
+ dbStatComp(db_not_scaled.raw[shard], db_scaled_1024.raw[shard], 1024);
+}
- /* db.stats() tests */
- db_not_scaled = assert.commandWorked(db.stats());
- db_scaled_512 = assert.commandWorked(db.stats(512));
- db_scaled_1024 = assert.commandWorked(db.stats(1024));
+dbStatComp(db_not_scaled, db_scaled_512, 512);
+dbStatComp(db_not_scaled, db_scaled_1024, 1024);
- for (var shard in db_not_scaled.raw) {
- dbStatComp(db_not_scaled.raw[shard], db_scaled_512.raw[shard], 512);
- dbStatComp(db_not_scaled.raw[shard], db_scaled_1024.raw[shard], 1024);
- }
+/* db.collection.stats() tests */
+coll_not_scaled = assert.commandWorked(db.foo.stats());
+coll_scaled_512 = assert.commandWorked(db.foo.stats(512));
+coll_scaled_1024 = assert.commandWorked(db.foo.stats(1024));
- dbStatComp(db_not_scaled, db_scaled_512, 512);
- dbStatComp(db_not_scaled, db_scaled_1024, 1024);
+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);
+}
- /* db.collection.stats() tests */
- coll_not_scaled = assert.commandWorked(db.foo.stats());
- coll_scaled_512 = assert.commandWorked(db.foo.stats(512));
- coll_scaled_1024 = assert.commandWorked(db.foo.stats(1024));
+collStatComp(coll_not_scaled, coll_scaled_512, 512, true);
+collStatComp(coll_not_scaled, coll_scaled_1024, 1024, true);
- 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);
+/* 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 || 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));
}
+}
- 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 || 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));
- }
- }
+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);
+// 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);
- }());
+// indexDetailsName - show indexDetails results for this index name only.
+checkIndexDetails({indexDetails: true, indexDetailsName: indexName}, indexName);
+}());
- s.stop();
+s.stop();
})();