diff options
author | Esha Maharishi <esha.maharishi@mongodb.com> | 2020-02-04 16:22:19 -0500 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-03-16 19:29:38 +0000 |
commit | 2af596d72edc259df7b66d94169fc628391631ab (patch) | |
tree | 32ce8032e24e77a053ca335940ebf2417a493b52 /jstests/sharding/cleanup_orphaned_basic.js | |
parent | 800da7962b1fed69986b099b694d12e16658be99 (diff) | |
download | mongo-2af596d72edc259df7b66d94169fc628391631ab.tar.gz |
SERVER-46889 Add back original tests of cleanupOrphaned, but with shards running with disableResumableRangeDeleter=true
Diffstat (limited to 'jstests/sharding/cleanup_orphaned_basic.js')
-rw-r--r-- | jstests/sharding/cleanup_orphaned_basic.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/jstests/sharding/cleanup_orphaned_basic.js b/jstests/sharding/cleanup_orphaned_basic.js new file mode 100644 index 00000000000..9e785300050 --- /dev/null +++ b/jstests/sharding/cleanup_orphaned_basic.js @@ -0,0 +1,124 @@ +// +// Basic tests of cleanupOrphaned. Validates that non allowed uses of the cleanupOrphaned +// command fail. +// +// requires_fcv_44 because the 'disableResumableRangeDeleter' parameter was introduced in v4.4. +// @tags: [requires_fcv_44] + +(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, setParameter: {"disableResumableRangeDeleter": true}}} +}); + +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); +})(); |