summaryrefslogtreecommitdiff
path: root/jstests/sharding/mongos_validate_writes.js
diff options
context:
space:
mode:
authorgregs <greg@10gen.com>2012-06-07 17:53:00 -0400
committergregs <greg@10gen.com>2012-06-08 22:42:01 -0400
commita65d2bc01f263ccefc1a7392f48b362338c83daf (patch)
tree758a3e6fded6dd6175929747f469d54c37f6d9c3 /jstests/sharding/mongos_validate_writes.js
parent12f5147fef50060852881f65ab02f72a8bfebf3f (diff)
downloadmongo-a65d2bc01f263ccefc1a7392f48b362338c83daf.tar.gz
SERVER-4262 test that invalid writes are detected even when mongos initially stale
also requires a fix for the WBL to report errors more nicely
Diffstat (limited to 'jstests/sharding/mongos_validate_writes.js')
-rw-r--r--jstests/sharding/mongos_validate_writes.js91
1 files changed, 91 insertions, 0 deletions
diff --git a/jstests/sharding/mongos_validate_writes.js b/jstests/sharding/mongos_validate_writes.js
new file mode 100644
index 00000000000..0bab919f280
--- /dev/null
+++ b/jstests/sharding/mongos_validate_writes.js
@@ -0,0 +1,91 @@
+//
+// Tests that mongos validating writes when stale does not DOS config servers
+//
+// Note that this is *unsafe* with broadcast removes and updates
+//
+
+var st = new ShardingTest({ shards : 2, mongos : 3, other : { separateConfig : true } })
+st.stopBalancer()
+
+var mongos = st.s0
+var staleMongosA = st.s1
+var staleMongosB = st.s2
+
+var admin = mongos.getDB( "admin" )
+var config = mongos.getDB( "config" )
+var coll = mongos.getCollection( "foo.bar" )
+var staleCollA = staleMongosA.getCollection( coll + "" )
+var staleCollB = staleMongosB.getCollection( coll + "" )
+
+printjson( admin.runCommand({ enableSharding : coll.getDB() + "" }) )
+coll.ensureIndex({ a : 1 })
+printjson( admin.runCommand({ shardCollection : coll + "", key : { a : 1 } }) )
+
+// Let the stale mongos see the collection state
+staleCollA.findOne()
+staleCollB.findOne()
+
+// Change the collection sharding state
+coll.drop()
+coll.ensureIndex({ b : 1 })
+printjson( admin.runCommand({ shardCollection : coll + "", key : { b : 1 } }) )
+
+// Make sure that we can successfully insert, even though we have stale state
+staleCollA.insert({ b : "b" })
+assert.eq( null, staleCollA.getDB().getLastError() )
+
+// Make sure we unsuccessfully insert with old info
+staleCollB.insert({ a : "a" })
+assert.neq( null, staleCollB.getDB().getLastError() )
+
+// Change the collection sharding state
+coll.drop()
+coll.ensureIndex({ c : 1 })
+printjson( admin.runCommand({ shardCollection : coll + "", key : { c : 1 } }) )
+
+// Make sure we can successfully upsert, even though we have stale state
+staleCollA.update({ c : "c" }, { c : "c" }, true )
+assert.eq( null, staleCollA.getDB().getLastError() )
+
+// Make sure we unsuccessfully upsert with old info
+staleCollB.update({ b : "b" }, { b : "b" }, true )
+assert.neq( null, staleCollB.getDB().getLastError() )
+
+// Change the collection sharding state
+coll.drop()
+coll.ensureIndex({ d : 1 })
+printjson( admin.runCommand({ shardCollection : coll + "", key : { d : 1 } }) )
+
+// Make sure we can successfully update, even though we have stale state
+coll.insert({ d : "d" })
+
+staleCollA.update({ d : "d" }, { $set : { x : "x" } }, false, false )
+assert.eq( null, staleCollA.getDB().getLastError() )
+assert.eq( staleCollA.findOne().x, "x" )
+
+// Make sure we unsuccessfully update with old info
+staleCollB.update({ c : "c" }, { $set : { x : "y" } }, false, false )
+assert.neq( null, staleCollB.getDB().getLastError() )
+assert.eq( staleCollB.findOne().x, "x" )
+
+// Change the collection sharding state
+coll.drop()
+coll.ensureIndex({ e : 1 })
+// Deletes need to be across two shards to trigger an error - this is probably an exceptional case
+printjson( admin.runCommand({ movePrimary : coll.getDB() + "", to : "shard0000" }) )
+printjson( admin.runCommand({ shardCollection : coll + "", key : { e : 1 } }) )
+printjson( admin.runCommand({ split : coll + "", middle : { e : 0 } }) )
+printjson( admin.runCommand({ moveChunk : coll + "", find : { e : 0 }, to : "shard0001" }) )
+
+// Make sure we can successfully remove, even though we have stale state
+coll.insert({ e : "e" })
+
+staleCollA.remove({ e : "e" }, true)
+assert.eq( null, staleCollA.getDB().getLastError() )
+assert.eq( null, staleCollA.findOne() )
+
+// Make sure we unsuccessfully remove with old info
+staleCollB.remove({ d : "d" }, true )
+assert.neq( null, staleCollB.getDB().getLastError() )
+
+st.stop()