123 lines
4.7 KiB
JavaScript
123 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 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}));
|
|
|
|
// cleanupOrphaned works on sharded collection.
|
|
assert.commandWorked(mongosAdmin.runCommand({enableSharding: coll.getDB().getName()}));
|
|
|
|
st.ensurePrimaryShard(coll.getDB().getName(), st.shard0.shardName);
|
|
|
|
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: st.shard1.shardName,
|
|
_waitForDelete: true
|
|
}));
|
|
|
|
assert.commandWorked(mongosAdmin.runCommand({
|
|
moveChunk: coll.getFullName(),
|
|
find: {_id: 1},
|
|
to: st.shard0.shardName,
|
|
_waitForDelete: true
|
|
}));
|
|
|
|
// 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();
|
|
MongoRunner.stopMongod(mongod);
|
|
|
|
})();
|