summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGreg Studer <greg@10gen.com>2011-12-09 16:51:07 -0500
committerEliot Horowitz <eliot@10gen.com>2011-12-11 00:06:04 -0500
commit9179db2dc807de8bb860f7a7800de2630ad04eab (patch)
treef1f632512b579b7f803b37b8f560b0958c3e4b17
parentf8a4019253010f3d0bbca3b66e89707c961d6620 (diff)
downloadmongo-9179db2dc807de8bb860f7a7800de2630ad04eab.tar.gz
SERVER-4465 don't abort on local version reset unless it's a meaningful reset
-rw-r--r--jstests/sharding/bouncing_count.js49
-rw-r--r--s/commands_public.cpp17
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;