summaryrefslogtreecommitdiff
path: root/jstests
diff options
context:
space:
mode:
Diffstat (limited to 'jstests')
-rw-r--r--jstests/filemd5.js11
-rw-r--r--jstests/profile1.js30
-rw-r--r--jstests/replsets/auth1.js9
-rw-r--r--jstests/replsets/auth2.js103
-rw-r--r--jstests/replsets/initial_sync3.js55
-rw-r--r--jstests/replsets/reconfig.js2
-rw-r--r--jstests/replsets/stepdown.js3
-rw-r--r--jstests/sharding/auth.js14
-rw-r--r--jstests/sharding/auto1.js3
-rw-r--r--jstests/sharding/bouncing_count.js49
-rw-r--r--jstests/sharding/migrateBig.js12
-rw-r--r--jstests/sharding/reset_shard_version.js51
-rw-r--r--jstests/sharding/shard_existing.js33
-rw-r--r--jstests/sharding/sort1.js13
-rw-r--r--jstests/sharding/writeback_shard_version.js42
-rw-r--r--jstests/slowNightly/large_chunk.js11
-rw-r--r--jstests/slowNightly/replica_set_shard_version.js83
-rw-r--r--jstests/slowNightly/sharding_migrateBigObject.js2
-rw-r--r--jstests/slowNightly/sharding_rs2.js5
-rw-r--r--jstests/tool/dumpsecondary.js32
-rw-r--r--jstests/tool/exportimport3.js27
21 files changed, 522 insertions, 68 deletions
diff --git a/jstests/filemd5.js b/jstests/filemd5.js
new file mode 100644
index 0000000..41d03a1
--- /dev/null
+++ b/jstests/filemd5.js
@@ -0,0 +1,11 @@
+
+db.fs.chunks.drop();
+db.fs.chunks.insert({files_id:1,n:0,data:new BinData(0,"test")})
+
+x = db.runCommand({"filemd5":1,"root":"fs"});
+assert( ! x.ok , tojson(x) )
+
+db.fs.chunks.ensureIndex({files_id:1,n:1})
+x = db.runCommand({"filemd5":1,"root":"fs"});
+assert( x.ok , tojson(x) )
+
diff --git a/jstests/profile1.js b/jstests/profile1.js
index 9654357..ba01d59 100644
--- a/jstests/profile1.js
+++ b/jstests/profile1.js
@@ -55,12 +55,18 @@ try {
db.eval("sleep(1)") // pre-load system.js
- db.setProfilingLevel(2);
- before = db.system.profile.count();
+ function resetProfile( level , slowms ) {
+ db.setProfilingLevel(0);
+ db.system.profile.drop();
+ db.setProfilingLevel(level,slowms);
+ }
+
+ resetProfile(2);
+
db.eval( "sleep(25)" )
db.eval( "sleep(120)" )
- after = db.system.profile.count()
- assert.eq( before + 3 , after , "X1" )
+
+ assert.eq( 2 , db.system.profile.find( { "command.$eval" : /^sleep/ } ).count() );
/* sleep() could be inaccurate on certain platforms. let's check */
print("\nsleep 2 time actual:");
@@ -90,24 +96,20 @@ try {
return actual >= max ? 1 : 0;
}
- db.setProfilingLevel(1,100);
- before = db.system.profile.count();
+ resetProfile(1,100);
var delta = 0;
delta += evalSleepMoreThan( 15 , 100 );
delta += evalSleepMoreThan( 120 , 100 );
- after = db.system.profile.count()
- assert.eq( before + delta , after , "X2 : " + getProfileAString() )
+ assert.eq( delta , db.system.profile.find( { "command.$eval" : /^sleep/ } ).count() , "X2 : " + getProfileAString() )
- db.setProfilingLevel(1,20);
- before = db.system.profile.count();
+ resetProfile(1,20);
delta = 0;
delta += evalSleepMoreThan( 5 , 20 );
delta += evalSleepMoreThan( 120 , 20 );
- after = db.system.profile.count()
- assert.eq( before + delta , after , "X3 : " + getProfileAString() )
+ assert.eq( delta , db.system.profile.find( { "command.$eval" : /^sleep/ } ).count() , "X3 : " + getProfileAString() )
- db.profile.drop();
- db.setProfilingLevel(2)
+ resetProfile(2);
+ db.profile1.drop();
var q = { _id : 5 };
var u = { $inc : { x : 1 } };
db.profile1.update( q , u );
diff --git a/jstests/replsets/auth1.js b/jstests/replsets/auth1.js
index 71ab2d9..40a131a 100644
--- a/jstests/replsets/auth1.js
+++ b/jstests/replsets/auth1.js
@@ -8,11 +8,11 @@ var path = "jstests/libs/";
print("try starting mongod with auth");
-var m = runMongoProgram( "mongod", "--auth", "--port", port[4], "--dbpath", "/data/db/wrong-auth");
+var pargs = new MongodRunner( port[4], "/data/db/wrong-auth", false, false,
+ ["--auth"], {no_bind : true} );
+var m = pargs.start();
-assert.throws(function() {
- m.getDB("local").auth("__system", "");
-});
+assert.eq(m.getDB("local").auth("__system", ""), 0);
stopMongod(port[4]);
@@ -25,7 +25,6 @@ run("chmod", "644", path+"key2");
print("try starting mongod");
m = runMongoProgram( "mongod", "--keyFile", path+"key1", "--port", port[0], "--dbpath", "/data/db/" + name);
-
print("should fail with wrong permissions");
assert.eq(m, 2, "mongod should exit w/ 2: permissions too open");
stopMongod(port[0]);
diff --git a/jstests/replsets/auth2.js b/jstests/replsets/auth2.js
new file mode 100644
index 0000000..0fe1ae4
--- /dev/null
+++ b/jstests/replsets/auth2.js
@@ -0,0 +1,103 @@
+var name = "rs_auth2";
+var port = allocatePorts(3);
+var path = "jstests/libs/";
+
+print("change permissions on #1 & #2");
+run("chmod", "600", path+"key1");
+run("chmod", "600", path+"key2");
+
+var setupReplSet = function() {
+ print("start up rs");
+ var rs = new ReplSetTest({"name" : name, "nodes" : 3, "startPort" : port[0]});
+ rs.startSet();
+ rs.initiate();
+
+ print("getting master");
+ rs.getMaster();
+
+ print("getting secondaries");
+ assert.soon(function() {
+ var result1 = rs.nodes[1].getDB("admin").runCommand({isMaster: 1});
+ var result2 = rs.nodes[2].getDB("admin").runCommand({isMaster: 1});
+ return result1.secondary && result2.secondary;
+ });
+
+ return rs;
+};
+
+var checkNoAuth = function() {
+ print("without an admin user, things should work");
+
+ master.getDB("foo").bar.insert({x:1});
+ var result = master.getDB("admin").runCommand({getLastError:1});
+
+ printjson(result);
+ assert.eq(result.err, null);
+}
+
+var checkInvalidAuthStates = function() {
+ print("check that 0 is in recovering");
+ assert.soon(function() {
+ try {
+ var result = m.getDB("admin").runCommand({isMaster: 1});
+ return !result.ismaster && !result.secondary;
+ }
+ catch ( e ) {
+ print( e );
+ }
+ });
+
+ print("shut down 1, 0 still in recovering.");
+ rs.stop(1);
+ sleep(5);
+
+ assert.soon(function() {
+ var result = m.getDB("admin").runCommand({isMaster: 1});
+ return !result.ismaster && !result.secondary;
+ });
+
+ print("shut down 2, 0 becomes a secondary.");
+ rs.stop(2);
+
+ assert.soon(function() {
+ var result = m.getDB("admin").runCommand({isMaster: 1});
+ return result.secondary;
+ });
+
+ rs.restart(1, {"keyFile" : path+"key1"});
+ rs.restart(2, {"keyFile" : path+"key1"});
+};
+
+var checkValidAuthState = function() {
+ assert.soon(function() {
+ var result = m.getDB("admin").runCommand({isMaster : 1});
+ return result.secondary;
+ });
+};
+
+var rs = setupReplSet();
+var master = rs.getMaster();
+
+print("add an admin user");
+master.getDB("admin").addUser("foo","bar");
+m = rs.nodes[0];
+
+print("starting 1 and 2 with key file");
+rs.stop(1);
+rs.restart(1, {"keyFile" : path+"key1"});
+rs.stop(2);
+rs.restart(2, {"keyFile" : path+"key1"});
+
+checkInvalidAuthStates();
+
+print("restart mongod with bad keyFile");
+
+rs.stop(0);
+m = rs.restart(0, {"keyFile" : path+"key2"});
+
+checkInvalidAuthStates();
+
+rs.stop(0);
+m = rs.restart(0, {"keyFile" : path+"key1"});
+
+print("0 becomes a secondary");
diff --git a/jstests/replsets/initial_sync3.js b/jstests/replsets/initial_sync3.js
index 7f2af94..ef45581 100644
--- a/jstests/replsets/initial_sync3.js
+++ b/jstests/replsets/initial_sync3.js
@@ -1,11 +1,6 @@
/* test initial sync options
*
- * {state : 1}
- * {state : 2}
- * {name : host+":"+port}
- * {_id : 2}
- * {optime : now}
- * {optime : 1970}
+ * Make sure member can't sync from a member with a different buildIndexes setting.
*/
load("jstests/replsets/rslib.js");
@@ -14,46 +9,44 @@ var host = getHostName();
var port = allocatePorts(7);
print("Start set with three nodes");
-var replTest = new ReplSetTest( {name: name, nodes: 7} );
+var replTest = new ReplSetTest( {name: name, nodes: 3} );
var nodes = replTest.startSet();
replTest.initiate({
_id : name,
members : [
- {_id:0, host : host+":"+port[0]},
- {_id:1, host : host+":"+port[1], initialSync : {state : 1}},
- {_id:2, host : host+":"+port[2], initialSync : {state : 2}},
- {_id:3, host : host+":"+port[3], initialSync : {name : host+":"+port[2]}},
- {_id:4, host : host+":"+port[4], initialSync : {_id : 2}},
- {_id:5, host : host+":"+port[5], initialSync : {optime : new Date()}},
- {_id:6, host : host+":"+port[6], initialSync : {optime : new Date(0)}}
+ {_id:0, host : host+":"+port[0]},
+ {_id:1, host : host+":"+port[1]},
+ {_id:2, host : host+":"+port[2], priority : 0, buildIndexes : false},
]});
var master = replTest.getMaster();
print("Initial sync");
master.getDB("foo").bar.baz.insert({x:1});
+replTest.awaitReplication();
-print("Make sure everyone's secondary");
-wait(function() {
- var status = master.getDB("admin").runCommand({replSetGetStatus:1});
- occasionally(function() {
- printjson(status);
- });
+replTest.stop(0);
+replTest.stop(1);
- if (!status.members) {
- return false;
- }
+print("restart 1, clearing its data directory so it has to resync");
+replTest.start(1);
- for (i=0; i<7; i++) {
- if (status.members[i].state != 1 && status.members[i].state != 2) {
- return false;
- }
- }
- return true;
+print("make sure 1 does not become a secondary (because it cannot clone from 2)");
+sleep(10000);
+reconnect(nodes[1]);
+var result = nodes[1].getDB("admin").runCommand({isMaster : 1});
+assert(!result.ismaster, tojson(result));
+assert(!result.secondary, tojson(result));
- });
+print("bring 0 back up");
+replTest.restart(0);
-replTest.awaitReplication();
+print("now 1 should be able to initial sync");
+assert.soon(function() {
+ var result = nodes[1].getDB("admin").runCommand({isMaster : 1});
+ printjson(result);
+ return result.secondary;
+});
replTest.stopSet();
diff --git a/jstests/replsets/reconfig.js b/jstests/replsets/reconfig.js
index b7dca03..55ee505 100644
--- a/jstests/replsets/reconfig.js
+++ b/jstests/replsets/reconfig.js
@@ -64,6 +64,6 @@ result = nodes[0].getDB("admin").runCommand({replSetInitiate : {_id : "testSet2"
{_id : 0, tags : ["member0"]}
]}});
-assert(result.errmsg.match(/bad or missing host field/));
+assert(result.errmsg.match(/bad or missing host field/) , "error message doesn't match, got result:" + tojson(result) );
replTest2.stopSet();
diff --git a/jstests/replsets/stepdown.js b/jstests/replsets/stepdown.js
index 3a17b0e..67f10f9 100644
--- a/jstests/replsets/stepdown.js
+++ b/jstests/replsets/stepdown.js
@@ -36,12 +36,15 @@ printjson(result);
assert.eq(result.ok, 0);
print("\n do stepdown that should work");
+var threw = false;
try {
master.getDB("admin").runCommand({replSetStepDown: 50, force : true});
}
catch (e) {
print(e);
+ threw = true;
}
+assert(threw);
var r2 = master.getDB("admin").runCommand({ismaster : 1});
assert.eq(r2.ismaster, false);
diff --git a/jstests/sharding/auth.js b/jstests/sharding/auth.js
index 8d8d7d7..c9bf1e1 100644
--- a/jstests/sharding/auth.js
+++ b/jstests/sharding/auth.js
@@ -146,13 +146,17 @@ for (i=0; i<num; i++) {
s.getDB("test").foo.insert({x:i, abc : "defg", date : new Date(), str : "all the talk on the market"});
}
-var d1Chunks = s.getDB("config").chunks.count({shard : "d1"});
-var d2Chunks = s.getDB("config").chunks.count({shard : "d2"});
-var totalChunks = s.getDB("config").chunks.count({ns : "test.foo"});
+assert.soon( function(){
-print("chunks: " + d1Chunks+" "+d2Chunks+" "+totalChunks);
+ var d1Chunks = s.getDB("config").chunks.count({shard : "d1"});
+ var d2Chunks = s.getDB("config").chunks.count({shard : "d2"});
+ var totalChunks = s.getDB("config").chunks.count({ns : "test.foo"});
-assert(d1Chunks > 0 && d2Chunks > 0 && d1Chunks+d2Chunks == totalChunks);
+ print("chunks: " + d1Chunks+" "+d2Chunks+" "+totalChunks);
+
+ return d1Chunks > 0 && d2Chunks > 0 && d1Chunks+d2Chunks == totalChunks;
+ }
+ )
assert.eq(s.getDB("test").foo.count(), num+1);
diff --git a/jstests/sharding/auto1.js b/jstests/sharding/auto1.js
index bdd43e9..57b0a00 100644
--- a/jstests/sharding/auto1.js
+++ b/jstests/sharding/auto1.js
@@ -58,7 +58,8 @@ counts.push( s.config.chunks.count() );
assert( counts[counts.length-1] > counts[0] , "counts 1 : " + tojson( counts ) )
sorted = counts.slice(0)
-sorted.sort();
+// Sort doesn't sort numbers correctly by default, resulting in fail
+sorted.sort( function(a, b){ return a - b } )
assert.eq( counts , sorted , "counts 2 : " + tojson( counts ) )
print( counts )
diff --git a/jstests/sharding/bouncing_count.js b/jstests/sharding/bouncing_count.js
new file mode 100644
index 0000000..d9630a4
--- /dev/null
+++ b/jstests/sharding/bouncing_count.js
@@ -0,0 +1,49 @@
+// Tests whether new sharding is detected on insert by mongos
+
+var st = new ShardingTest( name = "test", shards = 10, verbose = 0, mongos = 3 )
+
+var mongosA = st.s0
+var mongosB = st.s1
+var mongosC = st.s2
+
+var admin = mongosA.getDB("admin")
+var config = mongosA.getDB("config")
+
+var collA = mongosA.getCollection( "foo.bar" )
+var collB = mongosB.getCollection( "" + collA )
+var collC = mongosB.getCollection( "" + collA )
+
+admin.runCommand({ enableSharding : "" + collA.getDB() })
+admin.runCommand({ shardCollection : "" + collA, key : { _id : 1 } })
+
+var shards = config.shards.find().sort({ _id : 1 }).toArray()
+
+jsTestLog( "Splitting up the collection..." )
+
+// Split up the collection
+for( var i = 0; i < shards.length; i++ ){
+ printjson( admin.runCommand({ split : "" + collA, middle : { _id : i } }) )
+ printjson( admin.runCommand({ moveChunk : "" + collA, find : { _id : i }, to : shards[i]._id }) )
+}
+
+mongosB.getDB("admin").runCommand({ flushRouterConfig : 1 })
+mongosC.getDB("admin").runCommand({ flushRouterConfig : 1 })
+printjson( collB.count() )
+printjson( collC.count() )
+
+// Change up all the versions...
+for( var i = 0; i < shards.length; i++ ){
+ printjson( admin.runCommand({ moveChunk : "" + collA, find : { _id : i }, to : shards[ (i + 1) % shards.length ]._id }) )
+}
+
+// Make sure mongos A is up-to-date
+mongosA.getDB("admin").runCommand({ flushRouterConfig : 1 })
+
+config.printShardingStatus( true )
+
+jsTestLog( "Running count!" )
+
+printjson( collB.count() )
+printjson( collC.find().toArray() )
+
+st.stop() \ No newline at end of file
diff --git a/jstests/sharding/migrateBig.js b/jstests/sharding/migrateBig.js
index 917f152..1613f17 100644
--- a/jstests/sharding/migrateBig.js
+++ b/jstests/sharding/migrateBig.js
@@ -35,8 +35,16 @@ db.printShardingStatus()
assert.throws( function(){ s.adminCommand( { movechunk : "test.foo" , find : { x : 50 } , to : s.getOther( s.getServer( "test" ) ).name } ); } , [] , "move should fail" )
-for ( i=0; i<20; i+= 2 )
- s.adminCommand( { split : "test.foo" , middle : { x : i } } )
+for ( i=0; i<20; i+= 2 ) {
+ try {
+ s.adminCommand( { split : "test.foo" , middle : { x : i } } );
+ }
+ catch ( e ) {
+ // we may have auto split on some of these
+ // which is ok
+ print(e);
+ }
+}
db.printShardingStatus()
diff --git a/jstests/sharding/reset_shard_version.js b/jstests/sharding/reset_shard_version.js
new file mode 100644
index 0000000..ea4a76c
--- /dev/null
+++ b/jstests/sharding/reset_shard_version.js
@@ -0,0 +1,51 @@
+// Tests whether a reset sharding version triggers errors
+
+jsTestLog( "Starting sharded cluster..." )
+
+var st = new ShardingTest( { shards : 1, mongos : 2 } )
+
+var mongosA = st.s0
+var mongosB = st.s1
+
+var collA = mongosA.getCollection( jsTestName() + ".coll" )
+collA.drop()
+var collB = mongosB.getCollection( "" + collA )
+
+st.shardColl( collA, { _id : 1 }, false )
+
+jsTestLog( "Inserting data..." )
+
+// Insert some data
+for ( var i = 0; i < 100; i++ ) {
+ collA.insert( { _id : i } )
+}
+
+jsTestLog( "Setting connection versions on both mongoses..." )
+
+assert.eq( collA.find().itcount(), 100 )
+assert.eq( collB.find().itcount(), 100 )
+
+jsTestLog( "Resetting connection version on shard..." )
+
+var admin = st.shard0.getDB( "admin" )
+
+printjson( admin.runCommand( {
+ setShardVersion : "" + collA, version : new Timestamp( 0, 0 ), configdb : st._configDB, serverID : new ObjectId(),
+ authoritative : true } ) )
+
+jsTestLog( "Querying with version reset..." )
+
+// This will cause a version check
+assert.eq(0, collA.findOne({_id:0})['_id'])
+
+jsTestLog( "Resetting connection version on shard again..." )
+
+printjson( admin.runCommand( {
+ setShardVersion : "" + collA, version : new Timestamp( 0, 0 ), configdb : st._configDB, serverID : new ObjectId(),
+ authoritative : true } ) )
+
+jsTestLog( "Doing count command with version reset..." )
+
+assert.eq(100, collA.count()) // Test for SERVER-4196
+
+st.stop() \ No newline at end of file
diff --git a/jstests/sharding/shard_existing.js b/jstests/sharding/shard_existing.js
new file mode 100644
index 0000000..315445e
--- /dev/null
+++ b/jstests/sharding/shard_existing.js
@@ -0,0 +1,33 @@
+
+s = new ShardingTest( "shard_existing" , 2 /* numShards */, 1 /* verboseLevel */, 1 /* numMongos */, { chunksize : 1 } )
+
+db = s.getDB( "test" )
+
+stringSize = 10000
+
+// we want a lot of data, so lets make a string to cheat :)
+bigString = "";
+while ( bigString.length < stringSize )
+ bigString += "this is a big string. ";
+
+dataSize = 20 * 1024 * 1024;
+
+numToInsert = dataSize / stringSize
+print( "numToInsert: " + numToInsert )
+
+for ( i=0; i<(dataSize/stringSize); i++ ) {
+ db.data.insert( { _id : i , s : bigString } )
+}
+
+db.getLastError();
+
+assert.lt( dataSize , db.data.stats().size )
+
+s.adminCommand( { enablesharding : "test" } );
+res = s.adminCommand( { shardcollection : "test.data" , key : { _id : 1 } } );
+printjson( res );
+
+assert.eq( 40 , s.config.chunks.find().itcount() , "not right number of chunks" );
+
+
+s.stop();
diff --git a/jstests/sharding/sort1.js b/jstests/sharding/sort1.js
index e2b287e..235e5c0 100644
--- a/jstests/sharding/sort1.js
+++ b/jstests/sharding/sort1.js
@@ -22,11 +22,18 @@ s.adminCommand( { split : "test.data" , middle : { 'sub.num' : 66 } } )
s.adminCommand( { movechunk : "test.data" , find : { 'sub.num' : 50 } , to : s.getOther( s.getServer( "test" ) ).name } );
-assert.eq( 3 , s.config.chunks.find().itcount() , "A1" );
+assert.lte( 3 , s.config.chunks.find().itcount() , "A1" );
temp = s.config.chunks.find().sort( { min : 1 } ).toArray();
-assert.eq( temp[0].shard , temp[2].shard , "A2" );
-assert.neq( temp[0].shard , temp[1].shard , "A3" );
+temp.forEach( printjsononeline )
+
+z = 0;
+for ( ; z<temp.length; z++ )
+ if ( temp[z].min["sub.num"] <= 50 && temp[z].max["sub.num"] > 50 )
+ break;
+
+assert.eq( temp[z-1].shard , temp[z+1].shard , "A2" );
+assert.neq( temp[z-1].shard , temp[z].shard , "A3" );
temp = db.data.find().sort( { 'sub.num' : 1 } ).toArray();
assert.eq( N , temp.length , "B1" );
diff --git a/jstests/sharding/writeback_shard_version.js b/jstests/sharding/writeback_shard_version.js
new file mode 100644
index 0000000..34af1f0
--- /dev/null
+++ b/jstests/sharding/writeback_shard_version.js
@@ -0,0 +1,42 @@
+// Tests whether a newly sharded collection can be handled by the wbl
+
+jsTestLog( "Starting sharded cluster..." )
+
+// Need to start as a replica set here, just because there's no other way to trigger separate configs,
+// See SERVER-4222
+var st = new ShardingTest( { shards : 1, mongos : 2, verbose : 2, other : { rs : true } } )
+
+st.setBalancer( false )
+
+var mongosA = st.s0
+var mongosB = st.s1
+
+jsTestLog( "Adding new collections...")
+
+var collA = mongosA.getCollection( jsTestName() + ".coll" )
+collA.insert({ hello : "world" })
+assert.eq( null, collA.getDB().getLastError() )
+
+var collB = mongosB.getCollection( "" + collA )
+collB.insert({ hello : "world" })
+assert.eq( null, collB.getDB().getLastError() )
+
+jsTestLog( "Enabling sharding..." )
+
+printjson( mongosA.getDB( "admin" ).runCommand({ enableSharding : "" + collA.getDB() }) )
+printjson( mongosA.getDB( "admin" ).runCommand({ shardCollection : "" + collA, key : { _id : 1 } }) )
+
+// MongoD doesn't know about the config shard version *until* MongoS tells it
+collA.findOne()
+
+jsTestLog( "Trigger wbl..." )
+
+collB.insert({ goodbye : "world" })
+assert.eq( null, collB.getDB().getLastError() )
+
+print( "Inserted..." )
+
+assert.eq( 3, collA.find().itcount() )
+assert.eq( 3, collB.find().itcount() )
+
+st.stop() \ No newline at end of file
diff --git a/jstests/slowNightly/large_chunk.js b/jstests/slowNightly/large_chunk.js
index 6cf40e3..1f0b2e6 100644
--- a/jstests/slowNightly/large_chunk.js
+++ b/jstests/slowNightly/large_chunk.js
@@ -13,10 +13,6 @@ db = s.getDB( "test" );
// Step 1 - Test moving a large chunk
//
-// Turn on sharding on the 'test.foo' collection and generate a large chunk
-s.adminCommand( { enablesharding : "test" } );
-s.adminCommand( { shardcollection : "test.foo" , key : { _id : 1 } } );
-
bigString = ""
while ( bigString.length < 10000 )
bigString += "asdasdasdasdadasdasdasdasdasdasdasdasda";
@@ -28,6 +24,11 @@ while ( inserted < ( 400 * 1024 * 1024 ) ){
inserted += bigString.length;
}
db.getLastError();
+
+// Turn on sharding on the 'test.foo' collection and generate a large chunk
+s.adminCommand( { enablesharding : "test" } );
+s.adminCommand( { shardcollection : "test.foo" , key : { _id : 1 } } );
+
assert.eq( 1 , s.config.chunks.count() , "step 1 - need one large chunk" );
primary = s.getServer( "test" ).getDB( "test" );
@@ -48,4 +49,4 @@ assert.neq( before[0].shard , after[0].shard , "move chunk did not work" );
s.config.changelog.find().forEach( printjson )
-s.stop(); \ No newline at end of file
+s.stop();
diff --git a/jstests/slowNightly/replica_set_shard_version.js b/jstests/slowNightly/replica_set_shard_version.js
new file mode 100644
index 0000000..6221f4c
--- /dev/null
+++ b/jstests/slowNightly/replica_set_shard_version.js
@@ -0,0 +1,83 @@
+// Tests whether a Replica Set in a mongos cluster can cause versioning problems
+
+jsTestLog( "Starting sharded cluster..." )
+
+var st = new ShardingTest( { shards : 1, mongos : 2, other : { rs : true } } )
+
+var mongosA = st.s0
+var mongosB = st.s1
+var rs = st._rs[0].test
+var shard = st.shard0
+
+var sadmin = shard.getDB( "admin" )
+
+jsTestLog( "Stepping down replica set member..." )
+
+try{
+ sadmin.runCommand({ replSetStepDown : 3000, force : true })
+}
+catch( e ){
+ // stepdown errors out our conn to the shard
+ printjson( e )
+}
+
+jsTestLog( "Reconnecting..." )
+
+sadmin = new Mongo( st.shard0.host ).getDB("admin")
+
+assert.soon(
+ function(){
+ var res = sadmin.runCommand( "replSetGetStatus" );
+ for ( var i=0; i<res.members.length; i++ ) {
+ if ( res.members[i].state == 1 )
+ return true;
+ }
+ return false;
+ }
+);
+
+jsTestLog( "New primary elected..." )
+
+coll = mongosA.getCollection( jsTestName() + ".coll" );
+
+start = new Date();
+
+ReplSetTest.awaitRSClientHosts( coll.getMongo(), rs.getPrimary(), { ismaster : true }, rs )
+
+try{
+ coll.findOne()
+}
+catch( e ){
+ printjson( e )
+ assert( false )
+}
+
+end = new Date();
+
+print( "time to work for primary: " + ( ( end.getTime() - start.getTime() ) / 1000 ) + " seconds" );
+
+jsTestLog( "Found data from collection..." )
+
+// now check secondary
+
+try{
+ sadmin.runCommand({ replSetStepDown : 3000, force : true })
+}
+catch( e ){
+ // expected, since all conns closed
+ printjson( e )
+}
+
+sadmin = new Mongo( st.shard0.host ).getDB("admin")
+
+jsTestLog( "Stepped down secondary..." )
+
+other = new Mongo( mongosA.host );
+other.setSlaveOk( true );
+other = other.getCollection( jsTestName() + ".coll" );
+
+print( "eliot: " + tojson( other.findOne() ) );
+
+
+
+st.stop()
diff --git a/jstests/slowNightly/sharding_migrateBigObject.js b/jstests/slowNightly/sharding_migrateBigObject.js
index 5ad9ed1..8bf6713 100644
--- a/jstests/slowNightly/sharding_migrateBigObject.js
+++ b/jstests/slowNightly/sharding_migrateBigObject.js
@@ -51,7 +51,7 @@ assert.soon(
return res.length > 1 && Math.abs( res[0].nChunks - res[1].nChunks ) <= 3;
} ,
- "never migrated" , 180000 , 1000 );
+ "never migrated" , 9 * 60 * 1000 , 1000 );
stopMongod( 30000 );
stopMongod( 29999 );
diff --git a/jstests/slowNightly/sharding_rs2.js b/jstests/slowNightly/sharding_rs2.js
index 4de935b..162a9c6 100644
--- a/jstests/slowNightly/sharding_rs2.js
+++ b/jstests/slowNightly/sharding_rs2.js
@@ -71,6 +71,11 @@ for ( i=0; i<10; i++ )
assert.eq( 17 , ts.findOne().x , "B1" )
m.setSlaveOk()
+
+// Confusingly, v2.0 mongos does not actually update the secondary status of any members until after the first
+// ReplicaSetMonitorWatcher round. Wait for that here.
+ReplSetTest.awaitRSClientHosts( m, rs.test.getSecondaries()[0], { secondary : true } )
+
for ( i=0; i<10; i++ )
assert.eq( 17 , ts.findOne().x , "B2" )
diff --git a/jstests/tool/dumpsecondary.js b/jstests/tool/dumpsecondary.js
new file mode 100644
index 0000000..4edb3f1
--- /dev/null
+++ b/jstests/tool/dumpsecondary.js
@@ -0,0 +1,32 @@
+var replTest = new ReplSetTest( {name: 'testSet', nodes: 2} );
+
+var nodes = replTest.startSet();
+replTest.initiate();
+
+var master = replTest.getMaster();
+db = master.getDB("foo")
+db.foo.save({a: 1000});
+replTest.awaitReplication();
+replTest.awaitSecondaryNodes();
+
+assert.eq( 1 , db.foo.count() , "setup" );
+
+var slaves = replTest.liveNodes.slaves;
+assert( slaves.length == 1, "Expected 1 slave but length was " + slaves.length );
+slave = slaves[0];
+
+runMongoProgram.apply(null, ['mongodump', '-h', slave.host, '--out', '/data/db/jstests_tool_dumpsecondary_external/'])
+
+db.foo.drop()
+
+assert.eq( 0 , db.foo.count() , "after drop" );
+
+runMongoProgram.apply(null, ['mongorestore', '-h', master.host, '/data/db/jstests_tool_dumpsecondary_external/'])
+
+assert.soon( "db.foo.findOne()" , "no data after sleep" );
+assert.eq( 1 , db.foo.count() , "after restore" );
+assert.eq( 1000 , db.foo.findOne().a , "after restore 2" );
+
+resetDbpath('/data/db/jstests_tool_dumpsecondary_external')
+
+replTest.stopSet(15) \ No newline at end of file
diff --git a/jstests/tool/exportimport3.js b/jstests/tool/exportimport3.js
new file mode 100644
index 0000000..f18ba6c
--- /dev/null
+++ b/jstests/tool/exportimport3.js
@@ -0,0 +1,27 @@
+// exportimport3.js
+
+t = new ToolTest( "exportimport3" );
+
+c = t.startDB( "foo" );
+assert.eq( 0 , c.count() , "setup1" );
+c.save({a:1})
+c.save({a:2})
+c.save({a:3})
+c.save({a:4})
+c.save({a:5})
+
+assert.eq( 5 , c.count() , "setup2" );
+
+
+t.runTool( "export" , "--jsonArray" , "--out" , t.extFile , "-d" , t.baseName , "-c" , "foo" );
+
+c.drop();
+assert.eq( 0 , c.count() , "after drop" , "-d" , t.baseName , "-c" , "foo" );;
+
+t.runTool( "import" , "--jsonArray" , "--file" , t.extFile , "-d" , t.baseName , "-c" , "foo" );
+
+assert.soon( "c.findOne()" , "no data after sleep" );
+assert.eq( 5 , c.count() , "after restore 2" );
+
+
+t.stop();