Files
mongo/jstests/sharding/shard_collection_basic.js
Misha Tyulenev fa30e3f036 SERVER-21134 add basic tests for shardCollection command
(cherry picked from commit ea91373329)
2015-12-10 17:07:22 -05:00

182 lines
5.6 KiB
JavaScript

//
// 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();
})()