summaryrefslogtreecommitdiff
path: root/jstests/sharding/shard_collection_basic.js
diff options
context:
space:
mode:
authorMisha Tyulenev <misha@mongodb.com>2015-12-10 11:14:00 -0500
committerMisha Tyulenev <misha@mongodb.com>2015-12-10 15:09:50 -0500
commitea913733299778790e3a89e630a716ec7058c3a9 (patch)
tree64369b1d1b0821865922191ac727633df2cc5f84 /jstests/sharding/shard_collection_basic.js
parentaa77f50235503a1c3c4883244ed9d805412c10fe (diff)
downloadmongo-ea913733299778790e3a89e630a716ec7058c3a9.tar.gz
SERVER-21134 add basic tests for shardCollection command
Diffstat (limited to 'jstests/sharding/shard_collection_basic.js')
-rw-r--r--jstests/sharding/shard_collection_basic.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/jstests/sharding/shard_collection_basic.js b/jstests/sharding/shard_collection_basic.js
new file mode 100644
index 00000000000..50e5a45bddf
--- /dev/null
+++ b/jstests/sharding/shard_collection_basic.js
@@ -0,0 +1,181 @@
+//
+// Basic tests for shardCollection.
+//
+
+(function() {
+'use strict';
+
+var st = new ShardingTest({mongos:1, shards:2});
+var kDbName = 'db';
+var mongos = st.s0;
+
+function testAndClenaupWithKeyNoIndexFailed(keyDoc) {
+ assert.commandWorked(mongos.adminCommand({enableSharding : kDbName}));
+
+ var ns = kDbName + '.foo';
+ assert.commandFailed(mongos.adminCommand({
+ shardCollection: ns,
+ key: keyDoc
+ }));
+
+ assert.eq(mongos.getDB('config').collections.count({_id: ns, dropped: false}), 0);
+ mongos.getDB(kDbName).dropDatabase();
+}
+
+function testAndClenaupWithKeyOK(keyDoc) {
+ assert.commandWorked(mongos.adminCommand({enableSharding : kDbName}));
+ assert.commandWorked(mongos.getDB(kDbName).foo.createIndex(keyDoc));
+
+ var ns = kDbName + '.foo';
+ assert.eq(mongos.getDB('config').collections.count({_id: ns, dropped: false}), 0);
+
+ assert.commandWorked(mongos.adminCommand({
+ shardCollection: ns,
+ key: keyDoc
+ }));
+
+ assert.eq(mongos.getDB('config').collections.count({_id: ns, dropped: false}), 1);
+ mongos.getDB(kDbName).dropDatabase();
+}
+
+function testAndClenaupWithKeyNoIndexOK(keyDoc) {
+ assert.commandWorked(mongos.adminCommand({enableSharding : kDbName}));
+
+ var ns = kDbName + '.foo';
+ assert.eq(mongos.getDB('config').collections.count({_id: ns, dropped: false}), 0);
+
+ assert.commandWorked(mongos.adminCommand({
+ shardCollection: ns,
+ key: keyDoc
+ }));
+
+ assert.eq(mongos.getDB('config').collections.count({_id: ns, dropped: false}), 1);
+ mongos.getDB(kDbName).dropDatabase();
+}
+
+// Fail if db is not sharded.
+assert.commandFailed(mongos.adminCommand({ shardCollection: kDbName + '.foo', key: {_id:1} }));
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+
+// Fail if db is not sharding enabled.
+assert.commandFailed(mongos.adminCommand({ shardCollection: kDbName + '.foo', key: {_id:1} }));
+
+assert.commandWorked(mongos.adminCommand({enableSharding : kDbName}));
+
+// Verify wrong arguments errors.
+assert.commandFailed(mongos.adminCommand({ shardCollection: 'foo', key: {_id:1} }));
+
+assert.commandFailed(
+ mongos.adminCommand({ shardCollection: 'foo', key: "aaa" })
+);
+
+// shardCollection may only be run against admin database.
+assert.commandFailed(
+ mongos.getDB('test').runCommand({ shardCollection: kDbName + '.foo', key: {_id:1} }));
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+// Can't shard if key is not specified.
+assert.commandFailed(mongos.adminCommand({
+ shardCollection: kDbName + '.foo' }));
+
+assert.commandFailed(mongos.adminCommand({
+ shardCollection: kDbName + '.foo',
+ key: {}
+}));
+
+// Verify key format
+assert.commandFailed(mongos.adminCommand({
+ shardCollection: kDbName + '.foo',
+ key: {aKey: "hahahashed"}
+}));
+
+// Error if a collection is already sharded.
+assert.commandWorked(mongos.adminCommand({
+ shardCollection: kDbName + '.foo',
+ key: {_id:1}
+}));
+
+assert.commandFailed(mongos.adminCommand({ shardCollection: kDbName + '.foo', key: {_id:1} }));
+
+mongos.getDB(kDbName).dropDatabase();
+
+// Shard empty collections no index required.
+testAndClenaupWithKeyNoIndexOK({_id:1});
+testAndClenaupWithKeyNoIndexOK({_id:'hashed'});
+
+// Shard by a plain key.
+testAndClenaupWithKeyNoIndexOK({a:1});
+
+// Cant shard collection with data and no index on the shard key.
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+testAndClenaupWithKeyNoIndexFailed({a:1});
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+testAndClenaupWithKeyOK({a:1});
+
+// Shard by a hashed key.
+testAndClenaupWithKeyNoIndexOK({a:'hashed'});
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+testAndClenaupWithKeyNoIndexFailed({a:'hashed'});
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+testAndClenaupWithKeyOK({a:'hashed'});
+
+// Shard by a compound key.
+testAndClenaupWithKeyNoIndexOK({x:1, y:1});
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({x: 1, y: 1}));
+testAndClenaupWithKeyNoIndexFailed({x:1, y:1});
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({x: 1, y: 1}));
+testAndClenaupWithKeyOK({x:1, y:1});
+
+testAndClenaupWithKeyNoIndexFailed({x:'hashed', y:1});
+testAndClenaupWithKeyNoIndexFailed({x:'hashed', y:'hashed'});
+
+// Shard by a key component.
+testAndClenaupWithKeyOK({'z.x':1});
+testAndClenaupWithKeyOK({'z.x':'hashed'});
+
+// Can't shard by a multikey.
+assert.commandWorked(mongos.getDB(kDbName).foo.createIndex({a:1}));
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: [1,2,3,4,5], b:1}));
+testAndClenaupWithKeyNoIndexFailed({a:1});
+
+assert.commandWorked(mongos.getDB(kDbName).foo.createIndex({a:1, b:1}));
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: [1,2,3,4,5], b:1}));
+testAndClenaupWithKeyNoIndexFailed({a:1, b:1});
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+testAndClenaupWithKeyNoIndexFailed({a:'hashed'});
+
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: 1, b: 1}));
+testAndClenaupWithKeyOK({a:'hashed'});
+
+// Cant shard by a parallel arrays.
+assert.writeOK(mongos.getDB(kDbName).foo.insert({a: [1,2,3,4,5], b: [1,2,3,4,5]}));
+testAndClenaupWithKeyNoIndexFailed({a:1, b:1});
+
+assert.commandWorked(mongos.adminCommand({enableSharding : kDbName}));
+
+// Can't shard on unique hashed key.
+assert.commandFailed(mongos.adminCommand({
+ shardCollection: kDbName + '.foo',
+ key: {aKey:"hashed"},
+ unique: true
+}));
+
+// If shardCollection has unique:true it must have a unique index.
+assert.commandWorked(mongos.getDB(kDbName).foo.createIndex({aKey:1}));
+
+assert.commandFailed(mongos.adminCommand({
+ shardCollection: kDbName + '.foo',
+ key: {aKey:1},
+ unique: true
+}));
+
+st.stop();
+
+})()