Files
mongo/jstests/sharding/inserts_consistent.js

113 lines
3.1 KiB
JavaScript

// Shows how the WBL / getLastError logic depends on the actual chunks which are moved
// We should probably either always wait for writebacks, or don't at all
var st = new ShardingTest({ shards : 2, mongos : 2, verbose : 2, other : { separateConfig : true } })
jsTest.log( "Doing test setup..." )
// Stop balancer, since it'll just get in the way of this
st.stopBalancer()
var mongos = st.s
var admin = mongos.getDB("admin")
var config = mongos.getDB("config")
var coll = st.s.getCollection( jsTest.name() + ".coll" )
st.shardColl( coll, { _id : 1 }, { _id : 0 }, false )
jsTest.log( "Refreshing second mongos..." )
var mongosB = st.s1
var adminB = mongosB.getDB("admin")
var collB = mongosB.getCollection( coll + "" )
// Make sure mongosB knows about the coll
assert.eq( 0, collB.find().itcount() )
// printjson( adminB.runCommand({ flushRouterConfig : 1 }) )
jsTest.log( "Moving chunk to create stale mongos..." )
var otherShard = config.chunks.findOne({ _id : sh._collRE( coll ) }).shard
for( var i = 0; i < st._shardNames.length; i++ ){
if( otherShard != st._shardNames[i] ){
otherShard = st._shardNames[i]
break
}
}
print( "Other shard : " + otherShard )
printjson( admin.runCommand({ moveChunk : coll + "", find : { _id : 0 }, to : otherShard }) )
jsTest.log( "Inserting docs to be written back..." )
var nextId = -1
// Create writebacks, could add more here
for( var i = 0; i < 2; i++ ){
printjson( "Inserting " + nextId )
collB.insert({ _id : nextId--, hello : "world" })
}
// Refresh server
printjson( adminB.runCommand({ flushRouterConfig : 1 }) )
jsTest.log( "Inserting doc which successfully goes through..." )
// Do second write
collB.insert({ _id : nextId--, goodbye : "world" })
printjson( collB.getDB().getLastErrorObj() )
// Get error for last write
//assert.eq( null, collB.getDB().getLastError() )
jsTest.log( "GLE waited for the writebacks." )
// Assert that we waited for the writebacks...
assert.eq( coll.find().itcount(), 3 )
/*
jsTest.log( "Waiting for the writeback..." )
assert.soon(function(){
var count = coll.find().itcount()
print( "Count is : " + count )
return count == 3
})
*/
jsTest.log( "Now try moving the actual chunk we're writing to..." )
// Now move the actual chunk we're writing to
printjson( admin.runCommand({ moveChunk : coll + "", find : { _id : -1 }, to : otherShard }) )
jsTest.log( "Inserting second docs to get written back..." )
// Will fail entirely if too many of these, gle will wait too long
for( var i = 0; i < 2; i++ ){
collB.insert({ _id : nextId--, hello : "world" })
}
// Refresh server
printjson( adminB.runCommand({ flushRouterConfig : 1 }) )
jsTest.log( "Inserting second doc which successfully goes through..." )
// Do second write
collB.insert({ _id : nextId--, goodbye : "world" })
jsTest.log( "GLE is now waiting for the writeback!" )
// Get error for last write
assert.eq( null, collB.getDB().getLastError() )
jsTest.log( "All docs written this time!" )
// Assert that we now waited for the writeback
assert.eq( coll.find().itcount(), 6 )
jsTest.log( "DONE" )
st.stop()