summaryrefslogtreecommitdiff
path: root/jstests/sharding/index1.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/sharding/index1.js')
-rw-r--r--jstests/sharding/index1.js651
1 files changed, 324 insertions, 327 deletions
diff --git a/jstests/sharding/index1.js b/jstests/sharding/index1.js
index 482137a9d03..b440c535230 100644
--- a/jstests/sharding/index1.js
+++ b/jstests/sharding/index1.js
@@ -1,363 +1,360 @@
// SERVER-2326 - make sure that sharding only works with unique indices
(function() {
- var s = new ShardingTest({name: "shard_index", shards: 2, mongos: 1});
+var s = new ShardingTest({name: "shard_index", shards: 2, mongos: 1});
- // Regenerate fully because of SERVER-2782
- for (var i = 0; i < 22; i++) {
- var coll = s.admin._mongo.getDB("test").getCollection("foo" + i);
- coll.drop();
+// Regenerate fully because of SERVER-2782
+for (var i = 0; i < 22; i++) {
+ var coll = s.admin._mongo.getDB("test").getCollection("foo" + i);
+ coll.drop();
- var bulk = coll.initializeUnorderedBulkOp();
- for (var j = 0; j < 300; j++) {
- bulk.insert({num: j, x: 1});
- }
- assert.writeOK(bulk.execute());
+ var bulk = coll.initializeUnorderedBulkOp();
+ for (var j = 0; j < 300; j++) {
+ bulk.insert({num: j, x: 1});
+ }
+ assert.writeOK(bulk.execute());
- if (i == 0) {
- s.adminCommand({enablesharding: "" + coll._db});
- s.ensurePrimaryShard(coll.getDB().getName(), s.shard1.shardName);
- }
+ if (i == 0) {
+ s.adminCommand({enablesharding: "" + coll._db});
+ s.ensurePrimaryShard(coll.getDB().getName(), s.shard1.shardName);
+ }
+
+ print("\n\n\n\n\nTest # " + i);
+
+ if (i == 0) {
+ // Unique index exists, but not the right one.
+ coll.ensureIndex({num: 1}, {unique: true});
+ coll.ensureIndex({x: 1});
- print("\n\n\n\n\nTest # " + i);
-
- if (i == 0) {
- // Unique index exists, but not the right one.
- coll.ensureIndex({num: 1}, {unique: true});
- coll.ensureIndex({x: 1});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not shard collection when another unique index exists!");
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 1) {
- // Unique index exists as prefix, also index exists
- coll.ensureIndex({x: 1});
- coll.ensureIndex({x: 1, num: 1}, {unique: true});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
- } catch (e) {
- print(e);
- assert(false, "Should be able to shard non-unique index without unique option.");
- }
+ assert(!passed, "Should not shard collection when another unique index exists!");
+ }
+ if (i == 1) {
+ // Unique index exists as prefix, also index exists
+ coll.ensureIndex({x: 1});
+ coll.ensureIndex({x: 1, num: 1}, {unique: true});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard non-unique index without unique option.");
}
- if (i == 2) {
- // Non-unique index exists as prefix, also index exists. No unique index.
- coll.ensureIndex({x: 1});
- coll.ensureIndex({x: 1, num: 1});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
- passed = true;
-
- } catch (e) {
- print(e);
- assert(
- !passed,
- "Should be able to shard collection with no unique index if unique not specified.");
- }
+ }
+ if (i == 2) {
+ // Non-unique index exists as prefix, also index exists. No unique index.
+ coll.ensureIndex({x: 1});
+ coll.ensureIndex({x: 1, num: 1});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
+ passed = true;
+
+ } catch (e) {
+ print(e);
+ assert(
+ !passed,
+ "Should be able to shard collection with no unique index if unique not specified.");
}
- if (i == 3) {
- // Unique index exists as prefix, also unique index exists
- coll.ensureIndex({num: 1}, {unique: true});
- coll.ensureIndex({num: 1, x: 1}, {unique: true});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}, unique: true});
- } catch (e) {
- print(e);
- assert(false, "Should be able to shard collection with unique prefix index.");
- }
+ }
+ if (i == 3) {
+ // Unique index exists as prefix, also unique index exists
+ coll.ensureIndex({num: 1}, {unique: true});
+ coll.ensureIndex({num: 1, x: 1}, {unique: true});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}, unique: true});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard collection with unique prefix index.");
}
- if (i == 4) {
- // Unique index exists as id, also unique prefix index exists
- coll.ensureIndex({_id: 1, num: 1}, {unique: true});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {_id: 1}, unique: true});
- } catch (e) {
- print(e);
- assert(false, "Should be able to shard collection with unique id index.");
- }
+ }
+ if (i == 4) {
+ // Unique index exists as id, also unique prefix index exists
+ coll.ensureIndex({_id: 1, num: 1}, {unique: true});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {_id: 1}, unique: true});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard collection with unique id index.");
}
- if (i == 5) {
- // Unique index exists as id, also unique prefix index exists
- coll.ensureIndex({_id: 1, num: 1}, {unique: true});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {_id: 1, num: 1}, unique: true});
- } catch (e) {
- print(e);
- assert(false,
- "Should be able to shard collection with unique combination id index.");
- }
+ }
+ if (i == 5) {
+ // Unique index exists as id, also unique prefix index exists
+ coll.ensureIndex({_id: 1, num: 1}, {unique: true});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {_id: 1, num: 1}, unique: true});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard collection with unique combination id index.");
+ }
+ }
+ if (i == 6) {
+ coll.remove({});
+
+ // Unique index does not exist, also unique prefix index exists
+ coll.ensureIndex({num: 1, _id: 1}, {unique: true});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}, unique: true});
+ } catch (e) {
+ print(e);
+ assert(
+ false,
+ "Should be able to shard collection with no unique index but with a unique prefix index.");
}
- if (i == 6) {
- coll.remove({});
-
- // Unique index does not exist, also unique prefix index exists
- coll.ensureIndex({num: 1, _id: 1}, {unique: true});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}, unique: true});
- } catch (e) {
- print(e);
- assert(
- false,
- "Should be able to shard collection with no unique index but with a unique prefix index.");
- }
-
- printjson(coll.getIndexes());
-
- // Make sure the index created is unique!
- assert.eq(1,
- coll.getIndexes()
- .filter(function(z) {
- return friendlyEqual(z.key, {num: 1}) && z.unique;
- })
- .length);
+
+ printjson(coll.getIndexes());
+
+ // Make sure the index created is unique!
+ assert.eq(1,
+ coll.getIndexes()
+ .filter(function(z) {
+ return friendlyEqual(z.key, {num: 1}) && z.unique;
+ })
+ .length);
+ }
+ if (i == 7) {
+ coll.remove({});
+
+ // No index exists
+
+ try {
+ assert.eq(coll.find().itcount(), 0);
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard collection with no index on shard key.");
}
- if (i == 7) {
- coll.remove({});
-
- // No index exists
-
- try {
- assert.eq(coll.find().itcount(), 0);
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
- } catch (e) {
- print(e);
- assert(false, "Should be able to shard collection with no index on shard key.");
- }
+ }
+ if (i == 8) {
+ coll.remove({});
+
+ // No index exists
+
+ passed = false;
+ try {
+ assert.eq(coll.find().itcount(), 0);
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}, unique: true});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 8) {
- coll.remove({});
-
- // No index exists
-
- passed = false;
- try {
- assert.eq(coll.find().itcount(), 0);
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}, unique: true});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(
- passed,
- "Should be able to shard collection with unique flag but with no unique index on shard key, if coll empty.");
-
- printjson(coll.getIndexes());
-
- // Make sure the index created is unique!
- assert.eq(1,
- coll.getIndexes()
- .filter(function(z) {
- return friendlyEqual(z.key, {num: 1}) && z.unique;
- })
- .length);
+ assert(
+ passed,
+ "Should be able to shard collection with unique flag but with no unique index on shard key, if coll empty.");
+
+ printjson(coll.getIndexes());
+
+ // Make sure the index created is unique!
+ assert.eq(1,
+ coll.getIndexes()
+ .filter(function(z) {
+ return friendlyEqual(z.key, {num: 1}) && z.unique;
+ })
+ .length);
+ }
+ if (i == 9) {
+ // Unique index exists on a different field as well
+ coll.ensureIndex({num: 1}, {unique: true});
+ coll.ensureIndex({x: 1});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 9) {
- // Unique index exists on a different field as well
- coll.ensureIndex({num: 1}, {unique: true});
- coll.ensureIndex({x: 1});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not shard collection when another unique index exists!");
+ assert(!passed, "Should not shard collection when another unique index exists!");
+ }
+ if (i == 10) {
+ // try sharding non-empty collection without any index
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 10) {
- // try sharding non-empty collection without any index
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not be able to shard without index");
-
- // now add containing index and try sharding by prefix
- coll.ensureIndex({num: 1, x: 1});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(passed, "Should be able to shard collection with prefix of existing index");
-
- printjson(coll.getIndexes());
-
- // make sure no extra index is created
- assert.eq(2, coll.getIndexes().length);
+ assert(!passed, "Should not be able to shard without index");
+
+ // now add containing index and try sharding by prefix
+ coll.ensureIndex({num: 1, x: 1});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 11) {
- coll.remove({});
+ assert(passed, "Should be able to shard collection with prefix of existing index");
- // empty collection with useful index. check new index not created
- coll.ensureIndex({num: 1, x: 1});
+ printjson(coll.getIndexes());
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(passed, "Should be able to shard collection with prefix of existing index");
+ // make sure no extra index is created
+ assert.eq(2, coll.getIndexes().length);
+ }
+ if (i == 11) {
+ coll.remove({});
- printjson(coll.getIndexes());
+ // empty collection with useful index. check new index not created
+ coll.ensureIndex({num: 1, x: 1});
- // make sure no extra index is created
- assert.eq(2, coll.getIndexes().length);
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 12) {
- // check multikey values for x make index unusable for shard key
- coll.save({num: 100, x: [2, 3]});
- coll.ensureIndex({num: 1, x: 1});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not be able to shard collection with mulikey index");
+ assert(passed, "Should be able to shard collection with prefix of existing index");
+
+ printjson(coll.getIndexes());
+
+ // make sure no extra index is created
+ assert.eq(2, coll.getIndexes().length);
+ }
+ if (i == 12) {
+ // check multikey values for x make index unusable for shard key
+ coll.save({num: 100, x: [2, 3]});
+ coll.ensureIndex({num: 1, x: 1});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 13) {
- coll.save({num: [100, 200], x: 10});
- coll.ensureIndex({num: 1, x: 1});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not be able to shard collection with mulikey index");
+ assert(!passed, "Should not be able to shard collection with mulikey index");
+ }
+ if (i == 13) {
+ coll.save({num: [100, 200], x: 10});
+ coll.ensureIndex({num: 1, x: 1});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 14) {
- coll.save({num: 100, x: 10, y: [1, 2]});
- coll.ensureIndex({num: 1, x: 1, y: 1});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not be able to shard collection with mulikey index");
+ assert(!passed, "Should not be able to shard collection with mulikey index");
+ }
+ if (i == 14) {
+ coll.save({num: 100, x: 10, y: [1, 2]});
+ coll.ensureIndex({num: 1, x: 1, y: 1});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 15) {
- // try sharding with a hashed index
- coll.ensureIndex({num: "hashed"});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: "hashed"}});
- } catch (e) {
- print(e);
- assert(false, "Should be able to shard collection with hashed index.");
- }
+ assert(!passed, "Should not be able to shard collection with mulikey index");
+ }
+ if (i == 15) {
+ // try sharding with a hashed index
+ coll.ensureIndex({num: "hashed"});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: "hashed"}});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard collection with hashed index.");
}
- if (i == 16) {
- // create hashed index, but try to declare it unique when sharding
- coll.ensureIndex({num: "hashed"});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: "hashed"}, unique: true});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not be able to declare hashed shard key unique.");
+ }
+ if (i == 16) {
+ // create hashed index, but try to declare it unique when sharding
+ coll.ensureIndex({num: "hashed"});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: "hashed"}, unique: true});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 17) {
- // create hashed index, but unrelated unique index present
- coll.ensureIndex({x: "hashed"});
- coll.ensureIndex({num: 1}, {unique: true});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: "hashed"}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed,
- "Should not be able to shard on hashed index with another unique index");
+ assert(!passed, "Should not be able to declare hashed shard key unique.");
+ }
+ if (i == 17) {
+ // create hashed index, but unrelated unique index present
+ coll.ensureIndex({x: "hashed"});
+ coll.ensureIndex({num: 1}, {unique: true});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: "hashed"}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 18) {
- // create hashed index, and a regular unique index exists on same field
- coll.ensureIndex({num: "hashed"});
- coll.ensureIndex({num: 1}, {unique: true});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {num: "hashed"}});
- } catch (e) {
- print(e);
- assert(false, "Should be able to shard coll with hashed and regular unique index");
- }
+ assert(!passed, "Should not be able to shard on hashed index with another unique index");
+ }
+ if (i == 18) {
+ // create hashed index, and a regular unique index exists on same field
+ coll.ensureIndex({num: "hashed"});
+ coll.ensureIndex({num: 1}, {unique: true});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {num: "hashed"}});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard coll with hashed and regular unique index");
}
- if (i == 19) {
- // Create sparse index.
- coll.ensureIndex({x: 1}, {sparse: true});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not be able to shard coll with sparse index");
+ }
+ if (i == 19) {
+ // Create sparse index.
+ coll.ensureIndex({x: 1}, {sparse: true});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 20) {
- // Create partial index.
- coll.ensureIndex({x: 1}, {filter: {num: {$gt: 1}}});
-
- passed = false;
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
- passed = true;
- } catch (e) {
- print(e);
- }
- assert(!passed, "Should not be able to shard coll with partial index");
+ assert(!passed, "Should not be able to shard coll with sparse index");
+ }
+ if (i == 20) {
+ // Create partial index.
+ coll.ensureIndex({x: 1}, {filter: {num: {$gt: 1}}});
+
+ passed = false;
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
+ passed = true;
+ } catch (e) {
+ print(e);
}
- if (i == 21) {
- // Ensure that a collection with a normal index and a partial index can be sharded,
- // where
- // both are prefixed by the shard key.
-
- coll.ensureIndex({x: 1, num: 1}, {filter: {num: {$gt: 1}}});
- coll.ensureIndex({x: 1, num: -1});
-
- try {
- s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
- } catch (e) {
- print(e);
- assert(false, "Should be able to shard coll with regular and partial index");
- }
+ assert(!passed, "Should not be able to shard coll with partial index");
+ }
+ if (i == 21) {
+ // Ensure that a collection with a normal index and a partial index can be sharded,
+ // where
+ // both are prefixed by the shard key.
+
+ coll.ensureIndex({x: 1, num: 1}, {filter: {num: {$gt: 1}}});
+ coll.ensureIndex({x: 1, num: -1});
+
+ try {
+ s.adminCommand({shardcollection: "" + coll, key: {x: 1}});
+ } catch (e) {
+ print(e);
+ assert(false, "Should be able to shard coll with regular and partial index");
}
}
+}
- s.stop();
-
+s.stop();
})();