Files
mongo/jstests/sharding/move_chunk_basic.js
Kaloian Manassiev 3b7177d627 SERVER-24467 Make the shard implementation of 'moveChunk' joinable
This change makes the shard implementation of the 'moveChunk' command join
a currently running migration if that migration has exactly the same
arguments as the call. This allows retriability of this command by the
balancer.

In addition, it makes the moveChunk command report success if the
specified chunk is already located on the desired destination shard.
2016-06-13 16:55:01 -04:00

86 lines
3.0 KiB
JavaScript

//
// Basic tests for moveChunk.
//
(function() {
'use strict';
var st = new ShardingTest({mongos: 1, shards: 2});
var kDbName = 'db';
var mongos = st.s0;
var shard0 = st.shard0.shardName;
var shard1 = st.shard1.shardName;
assert.commandWorked(mongos.adminCommand({enableSharding: kDbName}));
st.ensurePrimaryShard(kDbName, shard0);
// Fail if invalid namespace.
assert.commandFailed(mongos.adminCommand({moveChunk: '', find: {_id: 1}, to: shard1}));
// 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}));
function testHashed() {
var ns = kDbName + '.fooHashed';
assert.commandWorked(mongos.adminCommand({shardCollection: ns, key: {_id: 'hashed'}}));
var aChunk = mongos.getDB('config').chunks.findOne({_id: RegExp(ns), shard: shard0});
assert(aChunk);
// Error if either of the bounds is not a valid shard key (BSON object - 1 yields a NaN)
assert.commandFailed(
mongos.adminCommand({moveChunk: ns, bounds: [aChunk.min - 1, aChunk.max], to: shard1}));
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}));
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.eq(shard1, mongos.getDB('config').chunks.findOne({_id: chunkId}).shard);
mongos.getDB(kDbName).foo.drop();
}
testHashed();
testNotHashed({a: 1});
testNotHashed({a: 1, b: 1});
st.stop();
})();