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.js270
1 files changed, 129 insertions, 141 deletions
diff --git a/jstests/sharding/merge_chunks_test.js b/jstests/sharding/merge_chunks_test.js
index 5d3bfbbb97b..3166f47113e 100644
--- a/jstests/sharding/merge_chunks_test.js
+++ b/jstests/sharding/merge_chunks_test.js
@@ -2,145 +2,133 @@
// Tests that merging chunks via mongos works/doesn't work with different chunk configurations
//
(function() {
- 'use strict';
-
- var st = new ShardingTest({shards: 2, mongos: 2});
-
- var mongos = st.s0;
- var staleMongos = st.s1;
- var admin = mongos.getDB("admin");
- var coll = mongos.getCollection("foo.bar");
-
- assert.commandWorked(admin.runCommand({enableSharding: coll.getDB() + ""}));
- st.ensurePrimaryShard('foo', st.shard0.shardName);
- assert.commandWorked(admin.runCommand({shardCollection: coll + "", key: {_id: 1}}));
-
- // 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.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 0}}));
- assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 10}}));
- assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 20}}));
- assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 40}}));
- assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 50}}));
- assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 90}}));
- assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 100}}));
- assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 110}}));
-
- assert.commandWorked(
- admin.runCommand({moveChunk: coll + "", find: {_id: 10}, to: st.shard1.shardName}));
- assert.commandWorked(
- admin.runCommand({moveChunk: coll + "", find: {_id: 90}, to: st.shard1.shardName}));
-
- st.printShardingStatus();
-
- // Insert some data into each of the consolidated ranges
- assert.writeOK(coll.insert({_id: 0}));
- assert.writeOK(coll.insert({_id: 10}));
- assert.writeOK(coll.insert({_id: 40}));
- assert.writeOK(coll.insert({_id: 110}));
-
- var staleCollection = staleMongos.getCollection(coll + "");
-
- jsTest.log("Trying merges that should fail...");
-
- // S0: min->0, 0->10, 20->40, 40->50, 50->90, 100->110, 110->max
- // S1: 10->20, 90->100
-
- // Make sure merging non-exact chunks is invalid
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 5}]}));
- assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 5}, {_id: 10}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 15}, {_id: 50}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 20}, {_id: 55}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 105}, {_id: MaxKey}]}));
-
- // Make sure merging single chunks is invalid
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 0}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 20}, {_id: 40}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 110}, {_id: MaxKey}]}));
-
- // Make sure merging over holes is invalid
- assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 0}, {_id: 40}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 40}, {_id: 110}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 50}, {_id: 110}]}));
-
- // Make sure merging between shards is invalid
- assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 0}, {_id: 20}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 10}, {_id: 40}]}));
- assert.commandFailed(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 40}, {_id: 100}]}));
- assert.eq(4, staleCollection.find().itcount());
-
- jsTest.log("Trying merges that should succeed...");
-
- // Make sure merge including the MinKey works
- assert.commandWorked(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 10}]}));
- assert.eq(4, staleCollection.find().itcount());
- // S0: min->10, 20->40, 40->50, 50->90, 100->110, 110->max
- // S1: 10->20, 90->100
-
- // Make sure merging three chunks in the middle works
- assert.commandWorked(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 20}, {_id: 90}]}));
- assert.eq(4, staleCollection.find().itcount());
- // S0: min->10, 20->90, 100->110, 110->max
- // S1: 10->20, 90->100
-
- // Make sure merge including the MaxKey works
- assert.commandWorked(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 100}, {_id: MaxKey}]}));
- assert.eq(4, staleCollection.find().itcount());
- // S0: min->10, 20->90, 100->max
- // S1: 10->20, 90->100
-
- // Make sure merging chunks after a chunk has been moved out of a shard succeeds
- assert.commandWorked(
- admin.runCommand({moveChunk: coll + "", find: {_id: 110}, to: st.shard1.shardName}));
- assert.commandWorked(
- admin.runCommand({moveChunk: coll + "", find: {_id: 10}, to: st.shard0.shardName}));
- assert.eq(4, staleCollection.find().itcount());
- // S0: min->10, 10->20, 20->90
- // S1: 90->100, 100->max
-
- assert.commandWorked(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 90}, {_id: MaxKey}]}));
- assert.eq(4, staleCollection.find().itcount());
- // S0: min->10, 10->20, 20->90
- // S1: 90->max
-
- // Make sure merge on the other shard after a chunk has been merged succeeds
- assert.commandWorked(
- admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 90}]}));
- // S0: min->90
- // S1: 90->max
-
- st.printShardingStatus(true);
-
- assert.eq(2, st.s0.getDB('config').chunks.find({'ns': 'foo.bar'}).itcount());
- assert.eq(
- 1,
- st.s0.getDB('config')
- .chunks
- .find({'ns': 'foo.bar', 'min._id': MinKey, 'max._id': 90, shard: st.shard0.shardName})
- .itcount());
- assert.eq(
- 1,
- st.s0.getDB('config')
- .chunks
- .find({'ns': 'foo.bar', 'min._id': 90, 'max._id': MaxKey, shard: st.shard1.shardName})
- .itcount());
-
- st.stop();
+'use strict';
+
+var st = new ShardingTest({shards: 2, mongos: 2});
+
+var mongos = st.s0;
+var staleMongos = st.s1;
+var admin = mongos.getDB("admin");
+var coll = mongos.getCollection("foo.bar");
+
+assert.commandWorked(admin.runCommand({enableSharding: coll.getDB() + ""}));
+st.ensurePrimaryShard('foo', st.shard0.shardName);
+assert.commandWorked(admin.runCommand({shardCollection: coll + "", key: {_id: 1}}));
+
+// 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.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 0}}));
+assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 10}}));
+assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 20}}));
+assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 40}}));
+assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 50}}));
+assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 90}}));
+assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 100}}));
+assert.commandWorked(admin.runCommand({split: coll + "", middle: {_id: 110}}));
+
+assert.commandWorked(
+ admin.runCommand({moveChunk: coll + "", find: {_id: 10}, to: st.shard1.shardName}));
+assert.commandWorked(
+ admin.runCommand({moveChunk: coll + "", find: {_id: 90}, to: st.shard1.shardName}));
+
+st.printShardingStatus();
+
+// Insert some data into each of the consolidated ranges
+assert.writeOK(coll.insert({_id: 0}));
+assert.writeOK(coll.insert({_id: 10}));
+assert.writeOK(coll.insert({_id: 40}));
+assert.writeOK(coll.insert({_id: 110}));
+
+var staleCollection = staleMongos.getCollection(coll + "");
+
+jsTest.log("Trying merges that should fail...");
+
+// S0: min->0, 0->10, 20->40, 40->50, 50->90, 100->110, 110->max
+// S1: 10->20, 90->100
+
+// Make sure merging non-exact chunks is invalid
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 5}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 5}, {_id: 10}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 15}, {_id: 50}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 20}, {_id: 55}]}));
+assert.commandFailed(
+ admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 105}, {_id: MaxKey}]}));
+
+// Make sure merging single chunks is invalid
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 0}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 20}, {_id: 40}]}));
+assert.commandFailed(
+ admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 110}, {_id: MaxKey}]}));
+
+// Make sure merging over holes is invalid
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 0}, {_id: 40}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 40}, {_id: 110}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 50}, {_id: 110}]}));
+
+// Make sure merging between shards is invalid
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 0}, {_id: 20}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 10}, {_id: 40}]}));
+assert.commandFailed(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 40}, {_id: 100}]}));
+assert.eq(4, staleCollection.find().itcount());
+
+jsTest.log("Trying merges that should succeed...");
+
+// Make sure merge including the MinKey works
+assert.commandWorked(
+ admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 10}]}));
+assert.eq(4, staleCollection.find().itcount());
+// S0: min->10, 20->40, 40->50, 50->90, 100->110, 110->max
+// S1: 10->20, 90->100
+
+// Make sure merging three chunks in the middle works
+assert.commandWorked(admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 20}, {_id: 90}]}));
+assert.eq(4, staleCollection.find().itcount());
+// S0: min->10, 20->90, 100->110, 110->max
+// S1: 10->20, 90->100
+
+// Make sure merge including the MaxKey works
+assert.commandWorked(
+ admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 100}, {_id: MaxKey}]}));
+assert.eq(4, staleCollection.find().itcount());
+// S0: min->10, 20->90, 100->max
+// S1: 10->20, 90->100
+
+// Make sure merging chunks after a chunk has been moved out of a shard succeeds
+assert.commandWorked(
+ admin.runCommand({moveChunk: coll + "", find: {_id: 110}, to: st.shard1.shardName}));
+assert.commandWorked(
+ admin.runCommand({moveChunk: coll + "", find: {_id: 10}, to: st.shard0.shardName}));
+assert.eq(4, staleCollection.find().itcount());
+// S0: min->10, 10->20, 20->90
+// S1: 90->100, 100->max
+
+assert.commandWorked(
+ admin.runCommand({mergeChunks: coll + "", bounds: [{_id: 90}, {_id: MaxKey}]}));
+assert.eq(4, staleCollection.find().itcount());
+// S0: min->10, 10->20, 20->90
+// S1: 90->max
+
+// Make sure merge on the other shard after a chunk has been merged succeeds
+assert.commandWorked(
+ admin.runCommand({mergeChunks: coll + "", bounds: [{_id: MinKey}, {_id: 90}]}));
+// S0: min->90
+// S1: 90->max
+
+st.printShardingStatus(true);
+
+assert.eq(2, st.s0.getDB('config').chunks.find({'ns': 'foo.bar'}).itcount());
+assert.eq(1,
+ st.s0.getDB('config')
+ .chunks
+ .find({'ns': 'foo.bar', 'min._id': MinKey, 'max._id': 90, shard: st.shard0.shardName})
+ .itcount());
+assert.eq(1,
+ st.s0.getDB('config')
+ .chunks
+ .find({'ns': 'foo.bar', 'min._id': 90, 'max._id': MaxKey, shard: st.shard1.shardName})
+ .itcount());
+
+st.stop();
})();