summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMisha Tyulenev <misha@mongodb.com>2015-12-10 15:27:52 -0500
committerMisha Tyulenev <misha@mongodb.com>2015-12-10 17:19:32 -0500
commite882ffceebe67be6d61f88a219ae511335405141 (patch)
treec9d2f443cec6c89be31ea398bedc701e617f245d
parente61483f604ad40e8a997a42ceee780301a0c680d (diff)
downloadmongo-e882ffceebe67be6d61f88a219ae511335405141.tar.gz
SERVER-21132 add basic tests for moveChunk command
(cherry picked from commit 1bcf9c7e197148299d7b49beef8290c7231d67cb)
-rw-r--r--jstests/sharding/move_chunk_basic.js96
1 files changed, 96 insertions, 0 deletions
diff --git a/jstests/sharding/move_chunk_basic.js b/jstests/sharding/move_chunk_basic.js
new file mode 100644
index 00000000000..aaf15b827f4
--- /dev/null
+++ b/jstests/sharding/move_chunk_basic.js
@@ -0,0 +1,96 @@
+//
+// Basic tests for moveChunk.
+//
+
+(function() {
+'use strict';
+
+var st = new ShardingTest({mongos:1, shards:2});
+
+var mongos = st.s0;
+
+var kDbName = 'db';
+
+var shards = mongos.getCollection('config.shards').find().toArray();
+
+var shard0 = shards[0]._id;
+var shard1 = shards[1]._id;
+
+function testHashed() {
+ var ns = kDbName + '.fooHashed';
+
+ // Errors if either bounds is not a valid shard key
+ assert.commandWorked(mongos.adminCommand({shardCollection: ns, key: {_id: 'hashed'}}));
+
+ var aChunk = mongos.getDB('config').chunks.findOne({_id: RegExp(ns), shard: shard0});
+ assert(aChunk);
+ assert.commandFailed(mongos.adminCommand({moveChunk: ns, bounds: [aChunk.min, aChunk.max-1],
+ to: shard1}));
+
+ // Fail if find and bounds are both set.
+ assert.commandFailed(mongos.adminCommand({moveChunk: ns, find: {_id: 1},
+ bounds: [aChunk.min, aChunk.max], to: shard1}));
+
+ // Using find on collections with hash shard keys should not crash
+ assert.commandFailed(mongos.adminCommand({moveChunk: ns, find: {_id: 1}, to: shard1}));
+
+ // Fail if chunk is already at shard
+ assert.commandFailed(mongos.adminCommand({moveChunk: ns, bounds: [aChunk.min, aChunk.max],
+ to: shard0}));
+
+ assert.commandWorked(mongos.adminCommand({moveChunk: ns, bounds: [aChunk.min, aChunk.max],
+ to: shard1}));
+ assert.eq(0, mongos.getDB('config').chunks.count({_id: aChunk._id, shard: shard0}));
+ assert.eq(1, mongos.getDB('config').chunks.count({_id: aChunk._id, shard: shard1}));
+
+ mongos.getDB(kDbName).fooHashed.drop();
+}
+
+function testNotHashed(keyDoc) {
+ var ns = kDbName + '.foo';
+
+ // Fail if find is not a valid shard key.
+ assert.commandWorked(mongos.adminCommand({shardCollection: ns, key: keyDoc}));
+
+ var chunkId = mongos.getDB('config').chunks.findOne({_id: RegExp(ns), shard: shard0})._id;
+
+ assert.commandFailed(mongos.adminCommand({moveChunk: ns, find: {xxx: 1}, to: shard1}));
+ assert.eq(shard0, mongos.getDB('config').chunks.findOne({_id: chunkId}).shard);
+
+ assert.commandWorked(mongos.adminCommand({moveChunk: ns, find: keyDoc, to: shard1}));
+ assert.eq(shard1, mongos.getDB('config').chunks.findOne({_id: chunkId}).shard);
+
+ // Fail if to shard does not exists
+ assert.commandFailed(mongos.adminCommand({moveChunk: ns, find: keyDoc, to: 'WrongShard'}));
+
+ // Fail if chunk is already at shard
+ assert.commandFailed(mongos.adminCommand({moveChunk: ns, find: keyDoc, to: shard1}));
+ assert.eq(shard1, mongos.getDB('config').chunks.findOne({_id: chunkId}).shard);
+
+ mongos.getDB(kDbName).foo.drop();
+}
+
+assert.commandWorked(mongos.adminCommand({enableSharding : kDbName}));
+
+st.ensurePrimaryShard(kDbName, shard0);
+
+// Fail if invalid namespace.
+var res = assert.commandFailed(mongos.adminCommand({moveChunk: '', find: {_id: 1}, to: shard1}));
+assert.eq( res.info);
+
+// Fail if database does not exist.
+assert.commandFailed(mongos.adminCommand({moveChunk: 'a.b', find: {_id: 1}, to: shard1}));
+
+// Fail if collection is unsharded.
+assert.commandFailed(mongos.adminCommand({moveChunk: kDbName + '.xxx',
+ find: {_id: 1}, to: shard1}));
+
+testHashed();
+
+testNotHashed({a:1});
+
+testNotHashed({a:1, b:1});
+
+st.stop();
+
+})()