Files
mongo/jstests/sharding/cleanup_orphaned_basic.js
2015-11-30 19:44:23 -05:00

152 lines
4.7 KiB
JavaScript

//
// Basic tests of cleanupOrphaned. Validates that non allowed uses of the cleanupOrphaned
// command fail.
//
(function() {
"use strict";
/*****************************************************************************
* Unsharded mongod.
****************************************************************************/
// cleanupOrphaned fails against unsharded mongod.
var mongod = MongoRunner.runMongod();
assert.commandFailed(mongod.getDB('admin').runCommand({cleanupOrphaned: 'foo.bar'}));
/*****************************************************************************
* Bad invocations of cleanupOrphaned command.
****************************************************************************/
var st = new ShardingTest({
other: {
rs: true,
rsOptions: {nodes: 2}
}
});
var mongos = st.s0;
var shards = mongos.getCollection('config.shards').find().toArray();
var mongosAdmin = mongos.getDB('admin');
var dbName = 'foo';
var collectionName = 'bar';
var ns = dbName + '.' + collectionName;
var coll = mongos.getCollection(ns);
// cleanupOrphaned fails against mongos ('no such command'): it must be run
// on mongod.
assert.commandFailed(mongosAdmin.runCommand({cleanupOrphaned: ns}));
// cleanupOrphaned must be run on admin DB.
var shardFooDB = st.shard0.getDB(dbName);
assert.commandFailed(shardFooDB.runCommand({cleanupOrphaned: ns}));
// Must be run on primary.
var secondaryAdmin = st.rs0.getSecondary().getDB('admin');
var response = secondaryAdmin.runCommand({cleanupOrphaned: ns});
print('cleanupOrphaned on secondary:');
printjson(response);
assert.commandFailed(response);
var shardAdmin = st.shard0.getDB('admin');
var badNS = ' \\/."*<>:|?';
assert.commandFailed(shardAdmin.runCommand({cleanupOrphaned: badNS}));
/*****************************************************************************
* Unsharded namespaces.
****************************************************************************/
// cleanupOrphaned fails on unsharded database.
assert.commandFailed(shardAdmin.runCommand({cleanupOrphaned: ns}));
// cleanupOrphaned works on sharded collection.
assert.commandWorked(mongosAdmin.runCommand({
enableSharding: coll.getDB().getName()
}));
st.ensurePrimaryShard(coll.getDB().getName(), shards[0]._id);
assert.commandWorked(mongosAdmin.runCommand({
shardCollection: ns,
key: {_id: 1}
}));
assert.commandWorked(shardAdmin.runCommand({cleanupOrphaned: ns}));
/*****************************************************************************
* Empty shard.
****************************************************************************/
// Ping shard[1] so it will be aware that it is sharded. Otherwise cleanupOrphaned
// may fail.
assert.commandWorked(mongosAdmin.runCommand({
moveChunk: coll.getFullName(),
find: {_id: 1},
to: shards[1]._id
}));
assert.commandWorked(mongosAdmin.runCommand({
moveChunk: coll.getFullName(),
find: {_id: 1},
to: shards[0]._id
}));
// Collection's home is shard0, there are no chunks assigned to shard1.
st.shard1.getCollection(ns).insert({});
assert.eq(null, st.shard1.getDB(dbName).getLastError());
assert.eq(1, st.shard1.getCollection(ns).count());
response = st.shard1.getDB('admin').runCommand({cleanupOrphaned: ns});
assert.commandWorked(response);
assert.eq({_id: {$maxKey:1}}, response.stoppedAtKey);
assert.eq(
0, st.shard1.getCollection(ns).count(),
"cleanupOrphaned didn't delete orphan on empty shard.");
/*****************************************************************************
* Bad startingFromKeys.
****************************************************************************/
// startingFromKey of MaxKey.
response = shardAdmin.runCommand({
cleanupOrphaned: ns,
startingFromKey: {_id: MaxKey}
});
assert.commandWorked(response);
assert.eq(null, response.stoppedAtKey);
// startingFromKey doesn't match number of fields in shard key.
assert.commandFailed(shardAdmin.runCommand({
cleanupOrphaned: ns,
startingFromKey: {someKey: 'someValue', someOtherKey: 1}
}));
// startingFromKey matches number of fields in shard key but not field names.
assert.commandFailed(shardAdmin.runCommand({
cleanupOrphaned: ns,
startingFromKey: {someKey: 'someValue'}
}));
var coll2 = mongos.getCollection('foo.baz');
assert.commandWorked(mongosAdmin.runCommand({
shardCollection: coll2.getFullName(),
key: {a:1, b:1}
}));
// startingFromKey doesn't match number of fields in shard key.
assert.commandFailed(shardAdmin.runCommand({
cleanupOrphaned: coll2.getFullName(),
startingFromKey: {someKey: 'someValue'}
}));
// startingFromKey matches number of fields in shard key but not field names.
assert.commandFailed(shardAdmin.runCommand({
cleanupOrphaned: coll2.getFullName(),
startingFromKey: {a: 'someValue', c: 1}
}));
st.stop();
})()