diff options
Diffstat (limited to 'jstests/sharding/features2.js')
-rw-r--r-- | jstests/sharding/features2.js | 348 |
1 files changed, 178 insertions, 170 deletions
diff --git a/jstests/sharding/features2.js b/jstests/sharding/features2.js index b9dc4d6309c..395d782570d 100644 --- a/jstests/sharding/features2.js +++ b/jstests/sharding/features2.js @@ -1,202 +1,210 @@ (function() { -var s = new ShardingTest({ name: "features2", shards: 2, mongos: 1 }); + var s = new ShardingTest({name: "features2", shards: 2, mongos: 1}); -s.adminCommand( { enablesharding : "test" } ); -s.ensurePrimaryShard('test', 'shard0001'); + s.adminCommand({enablesharding: "test"}); + s.ensurePrimaryShard('test', 'shard0001'); -a = s._connections[0].getDB( "test" ); -b = s._connections[1].getDB( "test" ); + a = s._connections[0].getDB("test"); + b = s._connections[1].getDB("test"); -db = s.getDB( "test" ); + db = s.getDB("test"); -// ---- distinct ---- + // ---- distinct ---- -db.foo.save( { x : 1 } ); -db.foo.save( { x : 2 } ); -db.foo.save( { x : 3 } ); -db.foo.ensureIndex( { x : 1 } ); + db.foo.save({x: 1}); + db.foo.save({x: 2}); + db.foo.save({x: 3}); + db.foo.ensureIndex({x: 1}); -assert.eq( "1,2,3" , db.foo.distinct( "x" ) , "distinct 1" ); -assert( a.foo.distinct("x").length == 3 || b.foo.distinct("x").length == 3 , "distinct 2" ); -assert( a.foo.distinct("x").length == 0 || b.foo.distinct("x").length == 0 , "distinct 3" ); + assert.eq("1,2,3", db.foo.distinct("x"), "distinct 1"); + assert(a.foo.distinct("x").length == 3 || b.foo.distinct("x").length == 3, "distinct 2"); + assert(a.foo.distinct("x").length == 0 || b.foo.distinct("x").length == 0, "distinct 3"); -assert.eq( 1 , s.onNumShards( "foo" ) , "A1" ); + assert.eq(1, s.onNumShards("foo"), "A1"); -s.shardColl( "foo" , { x : 1 } , { x : 2 } , { x : 3 }, null, true /* waitForDelete */ ); + s.shardColl("foo", {x: 1}, {x: 2}, {x: 3}, null, true /* waitForDelete */); -assert.eq( 2 , s.onNumShards( "foo" ) , "A2" ); + assert.eq(2, s.onNumShards("foo"), "A2"); -assert.eq( "1,2,3" , db.foo.distinct( "x" ) , "distinct 4" ); + assert.eq("1,2,3", db.foo.distinct("x"), "distinct 4"); -// ----- delete --- + // ----- delete --- -assert.eq( 3 , db.foo.count() , "D1" ); + assert.eq(3, db.foo.count(), "D1"); -db.foo.remove( { x : 3 } ); -assert.eq( 2 , db.foo.count() , "D2" ); + db.foo.remove({x: 3}); + assert.eq(2, db.foo.count(), "D2"); -db.foo.save( { x : 3 } ); -assert.eq( 3 , db.foo.count() , "D3" ); + db.foo.save({x: 3}); + assert.eq(3, db.foo.count(), "D3"); -db.foo.remove( { x : { $gt : 2 } } ); -assert.eq( 2 , db.foo.count() , "D4" ); + db.foo.remove({x: {$gt: 2}}); + assert.eq(2, db.foo.count(), "D4"); -db.foo.remove( { x : { $gt : -1 } } ); -assert.eq( 0 , db.foo.count() , "D5" ); + db.foo.remove({x: {$gt: -1}}); + assert.eq(0, db.foo.count(), "D5"); -db.foo.save( { x : 1 } ); -db.foo.save( { x : 2 } ); -db.foo.save( { x : 3 } ); -assert.eq( 3 , db.foo.count() , "D6" ); -db.foo.remove( {} ); -assert.eq( 0 , db.foo.count() , "D7" ); + db.foo.save({x: 1}); + db.foo.save({x: 2}); + db.foo.save({x: 3}); + assert.eq(3, db.foo.count(), "D6"); + db.foo.remove({}); + assert.eq(0, db.foo.count(), "D7"); -// --- _id key --- + // --- _id key --- -db.foo2.save( { _id : new ObjectId() } ); -db.foo2.save( { _id : new ObjectId() } ); -db.foo2.save( { _id : new ObjectId() } ); + db.foo2.save({_id: new ObjectId()}); + db.foo2.save({_id: new ObjectId()}); + db.foo2.save({_id: new ObjectId()}); -assert.eq( 1 , s.onNumShards( "foo2" ) , "F1" ); + assert.eq(1, s.onNumShards("foo2"), "F1"); -printjson( db.foo2.getIndexes() ); -s.adminCommand( { shardcollection : "test.foo2" , key : { _id : 1 } } ); + printjson(db.foo2.getIndexes()); + s.adminCommand({shardcollection: "test.foo2", key: {_id: 1}}); -assert.eq( 3 , db.foo2.count() , "F2" ); -db.foo2.insert( {} ); -assert.eq( 4 , db.foo2.count() , "F3" ); + assert.eq(3, db.foo2.count(), "F2"); + db.foo2.insert({}); + assert.eq(4, db.foo2.count(), "F3"); -// --- map/reduce + // --- map/reduce -db.mr.save( { x : 1 , tags : [ "a" , "b" ] } ); -db.mr.save( { x : 2 , tags : [ "b" , "c" ] } ); -db.mr.save( { x : 3 , tags : [ "c" , "a" ] } ); -db.mr.save( { x : 4 , tags : [ "b" , "c" ] } ); -db.mr.ensureIndex( { x : 1 } ); + db.mr.save({x: 1, tags: ["a", "b"]}); + db.mr.save({x: 2, tags: ["b", "c"]}); + db.mr.save({x: 3, tags: ["c", "a"]}); + db.mr.save({x: 4, tags: ["b", "c"]}); + db.mr.ensureIndex({x: 1}); -m = function(){ - this.tags.forEach( - function(z){ - emit( z , { count : 1 } ); + m = function() { + this.tags.forEach(function(z) { + emit(z, {count: 1}); + }); + }; + + r = function(key, values) { + var total = 0; + for (var i = 0; i < values.length; i++) { + total += values[i].count; } - ); -}; + return { + count: total + }; + }; + + doMR = function(n) { + print(n); + + // on-disk + + var res = db.mr.mapReduce(m, r, "smr1_out"); + printjson(res); + assert.eq(4, res.counts.input, "MR T0 " + n); + + var x = db[res.result]; + assert.eq(3, x.find().count(), "MR T1 " + n); + + var z = {}; + x.find().forEach(function(a) { + z[a._id] = a.value.count; + }); + assert.eq(3, Object.keySet(z).length, "MR T2 " + n); + assert.eq(2, z.a, "MR T3 " + n); + assert.eq(3, z.b, "MR T4 " + n); + assert.eq(3, z.c, "MR T5 " + n); + + x.drop(); + + // inline + + var res = db.mr.mapReduce(m, r, {out: {inline: 1}}); + printjson(res); + assert.eq(4, res.counts.input, "MR T6 " + n); + + var z = {}; + res.find().forEach(function(a) { + z[a._id] = a.value.count; + }); + printjson(z); + assert.eq(3, Object.keySet(z).length, "MR T7 " + n); + assert.eq(2, z.a, "MR T8 " + n); + assert.eq(3, z.b, "MR T9 " + n); + assert.eq(3, z.c, "MR TA " + n); + + }; + + doMR("before"); -r = function( key , values ){ - var total = 0; - for ( var i=0; i<values.length; i++ ){ - total += values[i].count; + assert.eq(1, s.onNumShards("mr"), "E1"); + s.shardColl("mr", {x: 1}, {x: 2}, {x: 3}, null, true /* waitForDelete */); + assert.eq(2, s.onNumShards("mr"), "E1"); + + doMR("after"); + + s.adminCommand({split: 'test.mr', middle: {x: 3}}); + s.adminCommand({split: 'test.mr', middle: {x: 4}}); + s.adminCommand({movechunk: 'test.mr', find: {x: 3}, to: s.getServer('test').name}); + + doMR("after extra split"); + + cmd = { + mapreduce: "mr", + map: "emit( ", + reduce: "fooz + ", + out: "broken1" + }; + + x = db.runCommand(cmd); + y = s._connections[0].getDB("test").runCommand(cmd); + + printjson(x); + printjson(y); + + // count + + db.countaa.save({"regex": /foo/i}); + db.countaa.save({"regex": /foo/i}); + db.countaa.save({"regex": /foo/i}); + assert.eq(3, db.countaa.count(), "counta1"); + assert.eq(3, db.countaa.find().itcount(), "counta1"); + + x = null; + y = null; + try { + x = db.runCommand("forceerror"); + } catch (e) { + x = e; } - return { count : total }; -}; - -doMR = function( n ){ - print(n); - - // on-disk - - var res = db.mr.mapReduce( m , r , "smr1_out" ); - printjson( res ); - assert.eq( 4 , res.counts.input , "MR T0 " + n ); - - var x = db[res.result]; - assert.eq( 3 , x.find().count() , "MR T1 " + n ); - - var z = {}; - x.find().forEach( function(a){ z[a._id] = a.value.count; } ); - assert.eq( 3 , Object.keySet( z ).length , "MR T2 " + n ); - assert.eq( 2 , z.a , "MR T3 " + n ); - assert.eq( 3 , z.b , "MR T4 " + n ); - assert.eq( 3 , z.c , "MR T5 " + n ); - - x.drop(); - - // inline - - var res = db.mr.mapReduce( m , r , { out : { inline : 1 } } ); - printjson( res ); - assert.eq( 4 , res.counts.input , "MR T6 " + n ); - - var z = {}; - res.find().forEach( function(a){ z[a._id] = a.value.count; } ); - printjson( z ); - assert.eq( 3 , Object.keySet( z ).length , "MR T7 " + n ) ; - assert.eq( 2 , z.a , "MR T8 " + n ); - assert.eq( 3 , z.b , "MR T9 " + n ); - assert.eq( 3 , z.c , "MR TA " + n ); - -}; - -doMR( "before" ); - -assert.eq( 1 , s.onNumShards( "mr" ) , "E1" ); -s.shardColl( "mr" , { x : 1 } , { x : 2 } , { x : 3 }, null, true /* waitForDelete */ ); -assert.eq( 2 , s.onNumShards( "mr" ) , "E1" ); - -doMR( "after" ); - -s.adminCommand({split:'test.mr' , middle:{x:3}} ); -s.adminCommand({split:'test.mr' , middle:{x:4}} ); -s.adminCommand({movechunk:'test.mr', find:{x:3}, to: s.getServer('test').name } ); - -doMR( "after extra split" ); - -cmd = { mapreduce : "mr" , map : "emit( " , reduce : "fooz + " , out : "broken1" }; - -x = db.runCommand( cmd ); -y = s._connections[0].getDB( "test" ).runCommand( cmd ); - -printjson( x ); -printjson( y ); - -// count - -db.countaa.save({"regex" : /foo/i}); -db.countaa.save({"regex" : /foo/i}); -db.countaa.save({"regex" : /foo/i}); -assert.eq( 3 , db.countaa.count() , "counta1" ); -assert.eq( 3 , db.countaa.find().itcount() , "counta1" ); - -x = null; y = null; -try { - x = db.runCommand( "forceerror" ); -} -catch ( e ){ - x = e; -} -try { - y = s._connections[0].getDB( "test" ).runCommand( "forceerror" ); -} -catch ( e ){ - y = e; -} - -// As the forceerror command is written, it doesnt set a code in the reply. -// OP_COMMAND changes will add a code of 121 (CommandFailed) if a failing command -// does not set one, so this comparison fails as "undefined" != 121. -// -// TODO: Uncomment this line when OP_COMMAND is implemented in mongos (SERVER-18292) -// as then MongoS should set code 121 as well. -// -// assert.eq( x.code , y.code , "assert format" ) -assert.eq( x.errmsg , y.errmsg , "assert format" ); -assert.eq( x.ok , y.ok , "assert format" ); - -// isMaster and query-wrapped-command -isMaster = db.runCommand({isMaster:1}); -assert( isMaster.ismaster ); -assert.eq( 'isdbgrid', isMaster.msg ); -delete isMaster.localTime; - -im2 = db.runCommand({query: {isMaster:1}}); -delete im2.localTime; -assert.eq( isMaster, im2 ); - -im2 = db.runCommand({$query: {isMaster:1}}); -delete im2.localTime; -assert.eq( isMaster, im2 ); - -s.stop(); + try { + y = s._connections[0].getDB("test").runCommand("forceerror"); + } catch (e) { + y = e; + } + + // As the forceerror command is written, it doesnt set a code in the reply. + // OP_COMMAND changes will add a code of 121 (CommandFailed) if a failing command + // does not set one, so this comparison fails as "undefined" != 121. + // + // TODO: Uncomment this line when OP_COMMAND is implemented in mongos (SERVER-18292) + // as then MongoS should set code 121 as well. + // + // assert.eq( x.code , y.code , "assert format" ) + assert.eq(x.errmsg, y.errmsg, "assert format"); + assert.eq(x.ok, y.ok, "assert format"); + + // isMaster and query-wrapped-command + isMaster = db.runCommand({isMaster: 1}); + assert(isMaster.ismaster); + assert.eq('isdbgrid', isMaster.msg); + delete isMaster.localTime; + + im2 = db.runCommand({query: {isMaster: 1}}); + delete im2.localTime; + assert.eq(isMaster, im2); + + im2 = db.runCommand({$query: {isMaster: 1}}); + delete im2.localTime; + assert.eq(isMaster, im2); + + s.stop(); })(); |