Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

SERVER-7003 fix migrations in the presence of active deletions

  • Loading branch information...
commit 01f04c8f1369eb51558637d8bda1315a475446e4 1 parent d89e787
@matulef matulef authored monkey101 committed
View
42 jstests/sharding/delete_during_migrate.js
@@ -0,0 +1,42 @@
+// Test migrating a big chunk while deletions are happening within that chunk.
+// Test is slightly non-deterministic, since removes could happen before migrate
+// starts. Protect against that by making chunk very large.
+
+// start up a new sharded cluster
+var st = new ShardingTest({ shards : 2, mongos : 1 });
+
+// stop balancer since we want manual control for this
+st.stopBalancer();
+
+var dbname = "testDB";
+var coll = "foo";
+var ns = dbname + "." + coll;
+var s = st.s0;
+var t = s.getDB( dbname ).getCollection( coll );
+
+// Create fresh collection with lots of docs
+t.drop();
+for ( i=0; i<200000; i++ ){
+ t.insert( { a : i } );
+}
+
+// enable sharding of the collection. Only 1 chunk.
+t.ensureIndex( { a : 1 } );
+s.adminCommand( { enablesharding : dbname } );
+s.adminCommand( { shardcollection : ns , key: { a : 1 } } );
+
+// start a parallel shell that deletes things
+startMongoProgramNoConnect( "mongo" ,
+ "--host" , getHostName() ,
+ "--port" , st.s0.port ,
+ "--eval" , "db." + coll + ".remove({});" ,
+ dbname );
+
+// migrate while deletions are happening
+var moveResult = s.adminCommand( { moveChunk : ns ,
+ find : { a : 1 } ,
+ to : st.getOther( st.getServer( dbname ) ).name } );
+// check if migration worked
+assert( moveResult.ok , "migration didn't work while doing deletes" );
+
+st.stop();
View
8 src/mongo/s/d_migrate.cpp
@@ -1678,10 +1678,16 @@ namespace mongo {
}
}
+ // id object most likely has form { _id : ObjectId(...) }
+ // infer from that correct index to use, e.g. { _id : 1 }
+ BSONObj idIndexPattern;
+ Helpers::toKeyFormat( id , idIndexPattern );
+
+ // TODO: create a better interface to remove objects directly
Helpers::removeRange( ns ,
id ,
id,
- findShardKeyIndexPattern_locked( ns , shardKeyPattern ),
+ idIndexPattern ,
true , /*maxInclusive*/
false , /* secondaryThrottle */
cmdLine.moveParanoia ? &rs : 0 , /*callback*/
Please sign in to comment.
Something went wrong with that request. Please try again.