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.js734
1 files changed, 351 insertions, 383 deletions
diff --git a/jstests/sharding/index1.js b/jstests/sharding/index1.js
index 7f0cea49cf0..766bd96e260 100644
--- a/jstests/sharding/index1.js
+++ b/jstests/sharding/index1.js
@@ -1,391 +1,359 @@
// SERVER-2326 - make sure that sharding only works with unique indices
(function() {
-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();
-
- 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(), 'shard0001');
- }
-
- 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!");
-
- }
- 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 == 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 == 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.");
- }
-
- 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 == 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 );
- }
- 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!" );
- }
- 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 );
- }
- if ( i == 11 ){
- coll.remove({});
-
- //empty collection with useful index. check new index not created
- 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 );
- }
- 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");
- }
- 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");
-
- }
- 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");
-
- }
- 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 == 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" );
-
- }
- 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 == 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" );
- }
- 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");
+ 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();
+
+ 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(), 'shard0001');
+ }
+
+ 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!");
+ }
+ 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 == 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 == 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.");
+ }
+
+ 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 == 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);
+ }
+ 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!");
+ }
+ 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);
+ }
+ if (i == 11) {
+ coll.remove({});
+
+ // empty collection with useful index. check new index not created
+ 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);
+ }
+ 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");
+ }
+ 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");
+ }
+ 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");
+ }
+ 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 == 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");
+ }
+ 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 == 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");
+ }
+ 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();
})();