diff options
-rw-r--r-- | jstests/sharding/bouncing_count.js | 49 | ||||
-rw-r--r-- | s/commands_public.cpp | 17 |
2 files changed, 59 insertions, 7 deletions
diff --git a/jstests/sharding/bouncing_count.js b/jstests/sharding/bouncing_count.js new file mode 100644 index 00000000000..d9630a4e930 --- /dev/null +++ b/jstests/sharding/bouncing_count.js @@ -0,0 +1,49 @@ +// Tests whether new sharding is detected on insert by mongos + +var st = new ShardingTest( name = "test", shards = 10, verbose = 0, mongos = 3 ) + +var mongosA = st.s0 +var mongosB = st.s1 +var mongosC = st.s2 + +var admin = mongosA.getDB("admin") +var config = mongosA.getDB("config") + +var collA = mongosA.getCollection( "foo.bar" ) +var collB = mongosB.getCollection( "" + collA ) +var collC = mongosB.getCollection( "" + collA ) + +admin.runCommand({ enableSharding : "" + collA.getDB() }) +admin.runCommand({ shardCollection : "" + collA, key : { _id : 1 } }) + +var shards = config.shards.find().sort({ _id : 1 }).toArray() + +jsTestLog( "Splitting up the collection..." ) + +// Split up the collection +for( var i = 0; i < shards.length; i++ ){ + printjson( admin.runCommand({ split : "" + collA, middle : { _id : i } }) ) + printjson( admin.runCommand({ moveChunk : "" + collA, find : { _id : i }, to : shards[i]._id }) ) +} + +mongosB.getDB("admin").runCommand({ flushRouterConfig : 1 }) +mongosC.getDB("admin").runCommand({ flushRouterConfig : 1 }) +printjson( collB.count() ) +printjson( collC.count() ) + +// Change up all the versions... +for( var i = 0; i < shards.length; i++ ){ + printjson( admin.runCommand({ moveChunk : "" + collA, find : { _id : i }, to : shards[ (i + 1) % shards.length ]._id }) ) +} + +// Make sure mongos A is up-to-date +mongosA.getDB("admin").runCommand({ flushRouterConfig : 1 }) + +config.printShardingStatus( true ) + +jsTestLog( "Running count!" ) + +printjson( collB.count() ) +printjson( collC.find().toArray() ) + +st.stop()
\ No newline at end of file diff --git a/s/commands_public.cpp b/s/commands_public.cpp index b7feedcf058..d962e9c7a3f 100644 --- a/s/commands_public.cpp +++ b/s/commands_public.cpp @@ -452,13 +452,16 @@ namespace mongo { for (set<Shard>::iterator it=shards.begin(), end=shards.end(); it != end; ++it) { ShardConnection conn(*it, fullns); - if ( conn.setVersion() ) { - total = 0; - shardCounts.clear(); - cm = conf->getChunkManagerIfExists( fullns ); - conn.done(); - hadToBreak = true; - break; + if ( conn.setVersion() ){ + ChunkManagerPtr newCM = conf->getChunkManagerIfExists( fullns ); + if( newCM->getVersion() != cm->getVersion() ){ + cm = newCM; + total = 0; + shardCounts.clear(); + conn.done(); + hadToBreak = true; + break; + } } BSONObj temp; |