1
// this tests that slaveOk'd queries in sharded setups get correctly routed when
2
// a slave goes into RECOVERING state, and don't break
5
print("\nstale_clustered.js " + s);
9
var shardTest = new ShardingTest( name = "clusteredstale" ,
13
otherParams = { rs : true } )//,
14
//rs0 : { logpath : "$path/mongod.log" },
15
//rs1 : { logpath : "$path/mongod.log" } } );
17
shardTest.setBalancer( false )
19
var mongos = shardTest.s0
20
var mongosSOK = shardTest.s1
21
mongosSOK.setSlaveOk()
23
var admin = mongos.getDB("admin")
24
var config = mongos.getDB("config")
26
var dbase = mongos.getDB("test")
27
var coll = dbase.getCollection("foo")
28
var dbaseSOk = mongosSOK.getDB( "" + dbase )
29
var collSOk = mongosSOK.getCollection( "" + coll )
32
var rsA = shardTest._rs[0].test
33
var rsB = shardTest._rs[1].test
35
rsA.getMaster().getDB( "test_a" ).dummy.insert( { x : 1 } )
36
rsB.getMaster().getDB( "test_b" ).dummy.insert( { x : 1 } )
38
rsA.awaitReplication()
39
rsB.awaitReplication()
41
prt("1: initial insert")
43
coll.save({ _id : -1, a : "a", date : new Date() })
44
coll.save({ _id : 1, b : "b", date : new Date() })
46
prt("2: shard collection")
48
shardTest.shardGo( coll, /* shardBy */ { _id : 1 }, /* splitAt */ { _id : 0 } )
50
prt("3: test normal and slaveOk queries")
52
// Make shardA and rsA the same
53
var shardA = shardTest.getShard( coll, { _id : -1 } )
54
var shardAColl = shardA.getCollection( "" + coll )
55
var shardB = shardTest.getShard( coll, { _id : 1 } )
57
if( shardA.name == rsB.getURL() ){
63
rsA.awaitReplication()
64
rsB.awaitReplication()
66
assert.eq( coll.find().itcount(), collSOk.find().itcount() )
67
assert.eq( shardAColl.find().itcount(), 1 )
68
assert.eq( shardAColl.findOne()._id, -1 )
70
prt("5: overflow oplog");
72
var secs = rsA.getSecondaries()
76
rsA.overflow( badSec )
78
prt("6: stop non-overflowed secondary")
80
rsA.stop( goodSec, undefined, true )
82
prt("7: check our regular and slaveOk query")
84
assert.eq( coll.find().itcount(), collSOk.find().itcount() )
86
prt("8: restart both our secondaries clean")
88
rsA.restart( rsA.getSecondaries(), { remember : true, startClean : true }, undefined, 5 * 60 * 1000 )
90
prt("9: wait for recovery")
92
rsA.waitForState( rsA.getSecondaries(), rsA.SECONDARY, 5 * 60 * 1000 )
94
prt("10: check our regular and slaveOk query")
96
assert.eq( coll.find().itcount(), collSOk.find().itcount() )