summaryrefslogtreecommitdiff
path: root/jstests/sharding/merge_chunks_test.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/sharding/merge_chunks_test.js')
-rw-r--r--jstests/sharding/merge_chunks_test.js113
1 files changed, 113 insertions, 0 deletions
diff --git a/jstests/sharding/merge_chunks_test.js b/jstests/sharding/merge_chunks_test.js
new file mode 100644
index 00000000000..22d0e8fc0fa
--- /dev/null
+++ b/jstests/sharding/merge_chunks_test.js
@@ -0,0 +1,113 @@
+//
+// Tests that merging chunks via mongos works/doesn't work with different chunk configurations
+//
+
+var options = { separateConfig : true, shardOptions : { verbose : 0 } };
+
+var st = new ShardingTest({ shards : 2, mongos : 2, other : options });
+st.stopBalancer();
+
+var mongos = st.s0;
+var staleMongos = st.s1;
+var admin = mongos.getDB( "admin" );
+var shards = mongos.getCollection( "config.shards" ).find().toArray();
+var coll = mongos.getCollection( "foo.bar" );
+
+assert( admin.runCommand({ enableSharding : coll.getDB() + "" }).ok );
+printjson( admin.runCommand({ movePrimary : coll.getDB() + "", to : shards[0]._id }) );
+assert( admin.runCommand({ shardCollection : coll + "", key : { _id : 1 } }).ok );
+
+// Create ranges MIN->0,0->10,(hole),20->40,40->50,50->90,(hole),100->110,110->MAX on first shard
+jsTest.log( "Creating ranges..." );
+
+assert( admin.runCommand({ split : coll + "", middle : { _id : 0 } }).ok );
+assert( admin.runCommand({ split : coll + "", middle : { _id : 10 } }).ok );
+assert( admin.runCommand({ split : coll + "", middle : { _id : 20 } }).ok );
+assert( admin.runCommand({ split : coll + "", middle : { _id : 40 } }).ok );
+assert( admin.runCommand({ split : coll + "", middle : { _id : 50 } }).ok );
+assert( admin.runCommand({ split : coll + "", middle : { _id : 90 } }).ok );
+assert( admin.runCommand({ split : coll + "", middle : { _id : 100 } }).ok );
+assert( admin.runCommand({ split : coll + "", middle : { _id : 110 } }).ok );
+
+assert( admin.runCommand({ moveChunk : coll + "", find : { _id : 10 }, to : shards[1]._id }).ok );
+assert( admin.runCommand({ moveChunk : coll + "", find : { _id : 90 }, to : shards[1]._id }).ok );
+
+st.printShardingStatus();
+
+// Insert some data into each of the consolidated ranges
+coll.insert({ _id : 0 });
+coll.insert({ _id : 40 });
+coll.insert({ _id : 110 });
+assert.eq( null, coll.getDB().getLastError() );
+
+var staleCollection = staleMongos.getCollection( coll + "" );
+
+jsTest.log( "Trying merges that should fail..." );
+
+// Make sure merging three chunks is invalid (for now)
+
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 20 }, { _id : 90 }] }).ok );
+
+// Make sure merging non-exact chunks is invalid
+
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : MinKey }, { _id : 5 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 5 }, { _id : 10 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 15 }, { _id : 50 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 20 }, { _id : 55 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 105 }, { _id : MaxKey }] }).ok );
+
+// Make sure merging single chunks is invalid
+
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : MinKey }, { _id : 0 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 20 }, { _id : 40 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 110 }, { _id : MaxKey }] }).ok );
+
+// Make sure merging over holes is invalid
+
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 0 }, { _id : 40 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 50 }, { _id : 110 }] }).ok );
+
+// Make sure merging between shards is invalid
+
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 0 }, { _id : 20 }] }).ok );
+assert( !admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 10 }, { _id : 40 }] }).ok );
+
+assert.eq( 3, staleCollection.find().itcount() );
+
+jsTest.log( "Trying merges that should succeed..." );
+
+assert( admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : MinKey }, { _id : 10 }] }).ok );
+
+assert.eq( 3, staleCollection.find().itcount() );
+
+assert( admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 20 }, { _id : 50 }] }).ok );
+
+assert( admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 20 }, { _id : 90 }] }).ok );
+
+assert.eq( 3, staleCollection.find().itcount() );
+
+assert( admin.runCommand({ mergeChunks : coll + "",
+ bounds : [{ _id : 100 }, { _id : MaxKey }] }).ok );
+
+assert.eq( 3, staleCollection.find().itcount() );
+
+st.printShardingStatus();
+
+st.stop();
+