1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
|
// Checks that movePrimary doesn't move collections detected as sharded when it begins moving
var st = new ShardingTest({ shards : 2, mongos : 2, verbose : 1 })
// Stop balancer, otherwise mongosB may load information about the database non-deterministically
st.stopBalancer();
var mongosA = st.s0
var mongosB = st.s1
st.shard0.getDB( "admin" ).runCommand({ setParameter : 1, logLevel : 2 })
st.shard1.getDB( "admin" ).runCommand({ setParameter : 1, logLevel : 2 })
var adminA = mongosA.getDB( "admin" )
var adminB = mongosB.getDB( "admin" )
var configA = mongosA.getDB( "config" )
// Setup three collections per-db
// 0 : not sharded
// 1 : sharded
// 2 : sharded but not seen as sharded by mongosB
var collsFooA = []
var collsFooB = []
var collsBarA = []
var collsBarB = []
for( var i = 0; i < 3; i++ ){
collsFooA.push( mongosA.getCollection( "foo.coll" + i ) )
collsFooB.push( mongosB.getCollection( "foo.coll" + i ) )
collsBarA.push( mongosA.getCollection( "bar.coll" + i ) )
collsBarB.push( mongosB.getCollection( "bar.coll" + i ) )
collsFooA[i].insert({ hello : "world" })
assert.eq( null, collsFooA[i].getDB().getLastError() )
collsBarA[i].insert({ hello : "world" })
assert.eq( null, collsBarA[i].getDB().getLastError() )
}
// Enable sharding
printjson( adminA.runCommand({ enableSharding : collsFooA[0].getDB() + "" }) )
printjson( adminA.runCommand({ enableSharding : collsBarA[0].getDB() + "" }) )
printjson( adminA.runCommand({ shardCollection : collsFooA[1] + "", key : { _id : 1 } }) )
printjson( adminA.runCommand({ shardCollection : collsFooA[2] + "", key : { _id : 1 } }) )
printjson( adminA.runCommand({ shardCollection : collsBarA[1] + "", key : { _id : 1 } }) )
printjson( adminA.runCommand({ shardCollection : collsBarA[2] + "", key : { _id : 1 } }) )
// All collections are now on primary shard
var fooPrimaryShard = configA.databases.findOne({ _id : collsFooA[0].getDB() + "" }).primary
var barPrimaryShard = configA.databases.findOne({ _id : collsBarA[0].getDB() + "" }).primary
var shards = configA.shards.find().toArray()
var fooPrimaryShard = fooPrimaryShard == shards[0]._id ? shards[0] : shards[1]
var fooOtherShard = fooPrimaryShard._id == shards[0]._id ? shards[1] : shards[0]
var barPrimaryShard = barPrimaryShard == shards[0]._id ? shards[0] : shards[1]
var barOtherShard = barPrimaryShard._id == shards[0]._id ? shards[1] : shards[0]
jsTest.log( "Setup collections for moveprimary test..." )
st.printShardingStatus()
jsTest.log( "Running movePrimary for foo through mongosA ..." )
// MongosA should already know about all the collection states
printjson( adminA.runCommand({ movePrimary : collsFooA[0].getDB() + "", to : fooOtherShard._id }) )
jsTest.log( "Run!" )
// All collections still correctly sharded / unsharded
assert.neq( null, collsFooA[0].findOne() )
assert.neq( null, collsFooA[1].findOne() )
assert.neq( null, collsFooA[2].findOne() )
assert.neq( null, collsFooB[0].findOne() )
assert.neq( null, collsFooB[1].findOne() )
assert.neq( null, collsFooB[2].findOne() )
// All indexes sane
assert.eq( 2, new Mongo( fooPrimaryShard.host ).getCollection( collsFooA[0].getDB() + ".system.indexes" ).find().count() )
assert.eq( 1, new Mongo( fooOtherShard.host ).getCollection( collsFooA[0].getDB() + ".system.indexes" ).find().count() )
jsTest.log( "Running movePrimary for bar through mongosB ..." )
// Make mongosB detect the first two collections in bar, but not third, to make sure
// we refresh our config state before doing dangerous things
collsBarB[0].findOne()
collsBarB[1].findOne()
printjson( adminB.runCommand({ movePrimary : collsBarA[0].getDB() + "", to : barOtherShard._id }) )
jsTest.log( "Run!" )
// All collections still correctly sharded / unsharded
assert.neq( null, collsBarA[0].findOne() )
assert.neq( null, collsBarA[1].findOne() )
assert.neq( null, collsBarA[2].findOne() )
assert.neq( null, collsBarB[0].findOne() )
assert.neq( null, collsBarB[1].findOne() )
assert.neq( null, collsBarB[2].findOne() )
// All indexes sane
assert.eq( 2, new Mongo( barPrimaryShard.host ).getCollection( collsBarA[0].getDB() + ".system.indexes" ).find().count() )
assert.eq( 1, new Mongo( barOtherShard.host ).getCollection( collsBarA[0].getDB() + ".system.indexes" ).find().count() )
st.stop()
|