summaryrefslogtreecommitdiff
path: root/jstests/replsets/stale_clustered.js
diff options
context:
space:
mode:
Diffstat (limited to 'jstests/replsets/stale_clustered.js')
-rw-r--r--jstests/replsets/stale_clustered.js101
1 files changed, 101 insertions, 0 deletions
diff --git a/jstests/replsets/stale_clustered.js b/jstests/replsets/stale_clustered.js
new file mode 100644
index 0000000..457231e
--- /dev/null
+++ b/jstests/replsets/stale_clustered.js
@@ -0,0 +1,101 @@
+// this tests that slaveOk'd queries in sharded setups get correctly routed when
+// a slave goes into RECOVERING state, and don't break
+
+function prt(s) {
+ print("\nstale_clustered.js " + s);
+ print();
+}
+
+var shardTest = new ShardingTest( name = "clusteredstale" ,
+ numShards = 2 ,
+ verboseLevel = 0 ,
+ numMongos = 2 ,
+ otherParams = { rs : true } )//,
+ //rs0 : { logpath : "$path/mongod.log" },
+ //rs1 : { logpath : "$path/mongod.log" } } );
+
+shardTest.setBalancer( false )
+
+var mongos = shardTest.s0
+var mongosSOK = shardTest.s1
+mongosSOK.setSlaveOk()
+
+var admin = mongos.getDB("admin")
+var config = mongos.getDB("config")
+
+var dbase = mongos.getDB("test")
+var coll = dbase.getCollection("foo")
+var dbaseSOk = mongosSOK.getDB( "" + dbase )
+var collSOk = mongosSOK.getCollection( "" + coll )
+
+
+var rsA = shardTest._rs[0].test
+var rsB = shardTest._rs[1].test
+
+rsA.getMaster().getDB( "test_a" ).dummy.insert( { x : 1 } )
+rsB.getMaster().getDB( "test_b" ).dummy.insert( { x : 1 } )
+
+rsA.awaitReplication()
+rsB.awaitReplication()
+
+prt("1: initial insert")
+
+coll.save({ _id : -1, a : "a", date : new Date() })
+coll.save({ _id : 1, b : "b", date : new Date() })
+
+prt("2: shard collection")
+
+shardTest.shardGo( coll, /* shardBy */ { _id : 1 }, /* splitAt */ { _id : 0 } )
+
+prt("3: test normal and slaveOk queries")
+
+// Make shardA and rsA the same
+var shardA = shardTest.getShard( coll, { _id : -1 } )
+var shardAColl = shardA.getCollection( "" + coll )
+var shardB = shardTest.getShard( coll, { _id : 1 } )
+
+if( shardA.name == rsB.getURL() ){
+ var swap = rsB
+ rsB = rsA
+ rsA = swap
+}
+
+rsA.awaitReplication()
+rsB.awaitReplication()
+
+assert.eq( coll.find().itcount(), collSOk.find().itcount() )
+assert.eq( shardAColl.find().itcount(), 1 )
+assert.eq( shardAColl.findOne()._id, -1 )
+
+prt("5: overflow oplog");
+
+var secs = rsA.getSecondaries()
+var goodSec = secs[0]
+var badSec = secs[1]
+
+rsA.overflow( badSec )
+
+prt("6: stop non-overflowed secondary")
+
+rsA.stop( goodSec, undefined, true )
+
+prt("7: check our regular and slaveok query")
+
+assert.eq( coll.find().itcount(), collSOk.find().itcount() )
+
+prt("8: restart both our secondaries clean")
+
+rsA.restart( rsA.getSecondaries(), { remember : true, startClean : true }, undefined, 5 * 60 * 1000 )
+
+prt("9: wait for recovery")
+
+rsA.waitForState( rsA.getSecondaries(), rsA.SECONDARY, 5 * 60 * 1000 )
+
+prt("10: check our regular and slaveok query")
+
+assert.eq( coll.find().itcount(), collSOk.find().itcount() )
+
+prt("DONE\n\n\n");
+
+//shardTest.stop()
+