diff options
author | nandinibhartiyaMDB <nandini.bhartiya@mongodb.com> | 2022-06-08 15:54:11 +0000 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2022-06-09 15:13:46 +0000 |
commit | 2f1e8dc34c7ddfa1c9dccab011759a12532c8219 (patch) | |
tree | f247ce5a740a5ba1ed3e0334f4d73176b8bf3bbe /jstests | |
parent | b0aeed9445ff41af07449fa757e1f231bce990b3 (diff) | |
download | mongo-2f1e8dc34c7ddfa1c9dccab011759a12532c8219.tar.gz |
SERVER-62272 : Migration OK for chunks existing before schema validator
(cherry picked from commit bc1ac6fb2eb66202d1acc08d158b102c57beabbd)
Diffstat (limited to 'jstests')
-rw-r--r-- | jstests/sharding/chunk_migration_with_schema_validation.js | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/jstests/sharding/chunk_migration_with_schema_validation.js b/jstests/sharding/chunk_migration_with_schema_validation.js new file mode 100644 index 00000000000..28b8427d45a --- /dev/null +++ b/jstests/sharding/chunk_migration_with_schema_validation.js @@ -0,0 +1,67 @@ +/** + * Ensure that schema validation rules applied after a collection has been populated, does not + * inhibit chunk migration for the data that existed before the rules were applied. + */ + +(function() { +'use strict'; + +load("jstests/libs/fail_point_util.js"); +load('jstests/libs/parallel_shell_helpers.js'); +load("jstests/sharding/libs/create_sharded_collection_util.js"); + +const st = new ShardingTest({mongos: 1, shards: 2, rs: {nodes: 3}}); +const dbName = "test"; +const collName = "foo"; +const ns = "test.foo"; +const testColl = st.s.getCollection(ns); + +assert.commandWorked(st.s.adminCommand({enableSharding: dbName})); +st.ensurePrimaryShard(dbName, st.shard0.shardName); +CreateShardedCollectionUtil.shardCollectionWithChunks(testColl, {x: 1}, [ + {min: {x: MinKey}, max: {x: 50}, shard: st.shard0.shardName}, + {min: {x: 50}, max: {x: MaxKey}, shard: st.shard0.shardName}, +]); + +for (let i = 0; i < 100; i++) { + assert.commandWorked(testColl.insert({x: i, name: "A"})); +} +assert.eq(100, testColl.find().itcount()); + +assert.commandWorked(testColl.runCommand({collMod: "foo", validator: {name: {$type: "int"}}})); + +let failpoint = configureFailPoint(st.shard1, "migrateThreadHangAtStep4"); + +const awaitResult = startParallelShell( + funWithArgs(function(ns, toShardName) { + assert.commandWorked( + db.adminCommand({moveChunk: ns, find: {x: 50}, to: toShardName, _waitForDelete: true})); + }, ns, st.shard1.shardName), st.s.port); + +failpoint.wait(); + +for (let i = 100; i < 200; i++) { + assert.commandWorked(testColl.runCommand( + {insert: collName, documents: [{x: i, name: "B"}], bypassDocumentValidation: true})); +} + +for (let i = 50; i < 75; ++i) { + assert.commandWorked(testColl.remove({x: i})); +} + +failpoint.off(); + +awaitResult(); + +const donor = st.shard0.rs.getPrimary().getDB(dbName); +const recipient = st.shard1.rs.getPrimary().getDB(dbName); +assert.eq(50, + donor.foo.find().itcount(), + "Number of documents on the donor shard after moveChunk is incorrect."); +assert.eq(125, + recipient.foo.find().itcount(), + "Number of documents on the recipient shard after moveChunk is incorrect."); +assert.eq(175, testColl.find().itcount(), "Number of total documents is incorrect"); + +st.stop(); +})(); |