summaryrefslogtreecommitdiff
path: root/jstests/noPassthrough/dbstats_sharded_collection.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/noPassthrough/dbstats_sharded_collection.js')
-rw-r--r--jstests/noPassthrough/dbstats_sharded_collection.js101
1 files changed, 101 insertions, 0 deletions
diff --git a/jstests/noPassthrough/dbstats_sharded_collection.js b/jstests/noPassthrough/dbstats_sharded_collection.js
new file mode 100644
index 00000000000..a724fc8b90b
--- /dev/null
+++ b/jstests/noPassthrough/dbstats_sharded_collection.js
@@ -0,0 +1,101 @@
+/**
+ * Tests that the dbStats command properly computes the stats by comparing the results from a
+ * sharded cluster to the summation of querying the mongod's directly.
+ *
+ * @tags: [requires_dbstats]
+ */
+
+(function() {
+"use strict";
+
+// Set up cluster with 2 shards, insert a batch of documents, and configure the cluster so both
+// shards have documents.
+const st = new ShardingTest({shards: 2, mongos: 1});
+const dbName = "db";
+const db = st.getDB(dbName);
+const collName = "foo";
+const ns = dbName + "." + collName;
+const numDocs = 100;
+
+assert.commandWorked(st.s.adminCommand({enableSharding: dbName}));
+
+let primaryShard = st.getPrimaryShard(dbName);
+let secondaryShard = st.getOther(primaryShard);
+
+let bulk = primaryShard.getCollection(ns).initializeUnorderedBulkOp();
+for (let i = 0; i < numDocs; i++) {
+ bulk.insert({_id: i, x: i, y: -i});
+}
+assert.commandWorked(bulk.execute());
+assert.commandWorked(st.s.adminCommand({shardCollection: ns, key: {_id: 1}}));
+assert.commandWorked(st.s.adminCommand({split: ns, middle: {_id: numDocs / 2}}));
+assert.commandWorked(st.s.adminCommand({moveChunk: ns, find: {_id: 0}, to: secondaryShard.name}));
+
+const scale = 1024 * 1024;
+let dbStats = db.runCommand({dbStats: 1, scale: scale});
+assert.commandWorked(dbStats);
+let shard0Stats = primaryShard.getDB(dbName).runCommand({dbStats: 1, scale: scale});
+assert.commandWorked(shard0Stats);
+let shard1Stats = secondaryShard.getDB(dbName).runCommand({dbStats: 1, scale: scale});
+assert.commandWorked(shard1Stats);
+
+// Compare each of the relevant fields in dbStats to make sure the individual shards' responses sum
+// to the overall cluster's value.
+let total = shard0Stats.collections + shard1Stats.collections;
+assert.eq(dbStats.collections,
+ total,
+ "Sharded collection dbStats returned " + dbStats.collections +
+ " collections total, but sum of inidividual shards' responses returned " + total +
+ " collections total");
+
+total = shard0Stats.views + shard1Stats.views;
+assert.eq(dbStats.views,
+ total,
+ "Sharded collection dbStats returned " + dbStats.views +
+ " views total, but sum of inidividual shards' responses returned " + total +
+ " views total");
+
+total = shard0Stats.objects + shard1Stats.objects;
+assert.eq(dbStats.objects,
+ total,
+ "Sharded collection dbStats returned " + dbStats.objects +
+ " objects total, but sum of inidividual shards' responses returned " + total +
+ " objects total");
+
+total = shard0Stats.dataSize + shard1Stats.dataSize;
+assert.eq(dbStats.dataSize,
+ total,
+ "Sharded collection dbStats returned " + dbStats.dataSize +
+ " dataSize total, but sum of inidividual shards' responses returned " + total +
+ " dataSize total");
+
+total = shard0Stats.storageSize + shard1Stats.storageSize;
+assert.eq(dbStats.storageSize,
+ total,
+ "Sharded collection dbStats returned " + dbStats.storageSize +
+ " storageSize total, but sum of inidividual shards' responses returned " + total +
+ " storageSize total");
+
+total = shard0Stats.indexes + shard1Stats.indexes;
+assert.eq(dbStats.indexes,
+ total,
+ "Sharded collection dbStats returned " + dbStats.indexes +
+ " indexes total, but sum of inidividual shards' responses returned " + total +
+ " indexes total");
+
+total = shard0Stats.indexSize + shard1Stats.indexSize;
+assert.eq(dbStats.indexSize,
+ total,
+ "Sharded collection dbStats returned " + dbStats.indexSize +
+ " indexSize total, but sum of inidividual shards' responses returned " + total +
+ " indexSize total");
+
+total = shard0Stats.totalSize + shard1Stats.totalSize;
+assert.eq(dbStats.totalSize,
+ total,
+ "Sharded collection dbStats returned " + dbStats.totalSize +
+ " totalSize total, but sum of inidividual shards' responses returned " + total +
+ " totalSize total");
+
+st.stop();
+})(); \ No newline at end of file