diff options
Diffstat (limited to 'jstests/repl')
-rw-r--r-- | jstests/repl/basic1.js | 19 | ||||
-rw-r--r-- | jstests/repl/dbcase.js | 95 | ||||
-rw-r--r-- | jstests/repl/drop_dups.js | 68 | ||||
-rw-r--r-- | jstests/repl/mastermaster1.js | 23 | ||||
-rw-r--r-- | jstests/repl/mod_move.js | 69 | ||||
-rw-r--r-- | jstests/repl/pair1.js | 100 | ||||
-rw-r--r-- | jstests/repl/pair2.js | 71 | ||||
-rw-r--r-- | jstests/repl/pair3.js | 245 | ||||
-rw-r--r-- | jstests/repl/pair4.js | 160 | ||||
-rw-r--r-- | jstests/repl/pair5.js | 95 | ||||
-rw-r--r-- | jstests/repl/pair6.js | 115 | ||||
-rw-r--r-- | jstests/repl/pair7.js | 85 | ||||
-rw-r--r-- | jstests/repl/repl2.js | 29 | ||||
-rw-r--r-- | jstests/repl/repl3.js | 58 | ||||
-rw-r--r-- | jstests/repl/replacePeer1.js | 82 | ||||
-rw-r--r-- | jstests/repl/replacePeer2.js | 86 | ||||
-rw-r--r-- | jstests/repl/snapshot2.js | 72 | ||||
-rw-r--r-- | jstests/repl/snapshot3.js | 53 |
18 files changed, 318 insertions, 1207 deletions
diff --git a/jstests/repl/basic1.js b/jstests/repl/basic1.js index 15fc983..4a6091d 100644 --- a/jstests/repl/basic1.js +++ b/jstests/repl/basic1.js @@ -60,7 +60,7 @@ r = function( key , v ){ correct = { a : 2 , b : 1 }; function checkMR( t ){ - var res = t.mapReduce( m , r , "basic1_out" ); + var res = t.mapReduce( m , r , { out : { inline : 1 } } ) assert.eq( correct , res.convertToSingleObject() , "checkMR: " + tojson( t ) ); } @@ -148,6 +148,23 @@ x = { _id : 1 , x : 1 } assert.eq( x , am.mu1.findOne() , "mu1" ); assert.soon( function(){ z = as.mu1.findOne(); printjson( z ); return friendlyEqual( x , z ); } , "mu2" ) +// profiling - this sould be last + +am.setProfilingLevel( 2 ) +am.foo.insert( { x : 1 } ) +am.foo.findOne() +block(); +assert.eq( 2 , am.system.profile.count() , "P1" ) +assert.eq( 0 , as.system.profile.count() , "P2" ) + +assert.eq( 1 , as.foo.findOne().x , "P3" ); +assert.eq( 0 , as.system.profile.count() , "P4" ) + +assert( as.getCollectionNames().indexOf( "system.profile" ) < 0 , "P4.5" ) + +as.setProfilingLevel(2) +as.foo.findOne(); +assert.eq( 1 , as.system.profile.count() , "P5" ) rt.stop(); diff --git a/jstests/repl/dbcase.js b/jstests/repl/dbcase.js new file mode 100644 index 0000000..10a5a61 --- /dev/null +++ b/jstests/repl/dbcase.js @@ -0,0 +1,95 @@ +// Test db case checking with replication SERVER-2111 + +baseName = "jstests_repl_dbcase"; + +rt = new ReplTest( baseName ); + +m = rt.start( true ); +s = rt.start( false ); + +n1 = "dbname"; +n2 = "dbNAme"; + +/** + * The value of n should be n1 or n2. Check that n is soon present while its + * opposite is not present. + */ +function check( n ) { + assert.soon( function() { + try { + // Our db name changes may trigger an exception - SERVER-3189. + names = s.getDBNames(); + } catch (e) { + return false; + } + n1Idx = names.indexOf( n1 ); + n2Idx = names.indexOf( n2 ); + if ( n1Idx != -1 && n2Idx != -1 ) { + // n1 and n2 may both be reported as present transiently. + return false; + } + // Return true if we matched expected n. + return -1 != names.indexOf( n ); + } ); +} + +/** Allow some time for additional operations to be processed by the slave. */ +function checkTwice( n ) { + check( n ); + // zzz is expected to be cloned after n1 and n2 because of its position in the alphabet. + m.getDB( "zzz" ).c.save( {} ); + assert.soon( function() { return s.getDB( "zzz" ).c.count(); } ) + check( n ); + m.getDB( "zzz" ).dropDatabase(); +} + +/** + * The slave may create in memory db names on the master matching old dbs it is + * attempting to clone. This function forces operation 'cmd' by deleting those + * in memory dbs if necessary. This function should only be called in cases where + * 'cmd' would succeed if not for the in memory dbs on master created by the slave. + */ +function force( cmd ) { + print( "cmd: " + cmd ); + eval( cmd ); + while( m1.getLastError() ) { + sleep( 100 ); + m1.dropDatabase(); + m2.dropDatabase(); + eval( cmd ); + } +} + +m1 = m.getDB( n1 ); +m2 = m.getDB( n2 ); + +m1.c.save( {} ); +m2.c.save( {} ); // will fail due to conflict +check( n1 ); + +m1.dropDatabase(); +force( "m2.c.save( {} );" ); // will now succeed +check( n2 ); + +m2.dropDatabase(); +force( "m1.c.save( {} );" ); +check( n1 ); + +for( i = 0; i < 5; ++i ) { + m1.dropDatabase(); + force( "m2.c.save( {} );" ); + m2.dropDatabase(); + force( "m1.c.save( {} );" ); +} +checkTwice( n1 ); + +m1.dropDatabase(); +force( "m2.c.save( {} );" ); + +for( i = 0; i < 5; ++i ) { + m2.dropDatabase(); + force( "m1.c.save( {} );" ); + m1.dropDatabase(); + force( "m2.c.save( {} );" ); +} +checkTwice( n2 ); diff --git a/jstests/repl/drop_dups.js b/jstests/repl/drop_dups.js new file mode 100644 index 0000000..100f469 --- /dev/null +++ b/jstests/repl/drop_dups.js @@ -0,0 +1,68 @@ + +var rt = new ReplTest( "drop_dups" ); + +m = rt.start( true ); +s = rt.start( false ); + +function block(){ + am.runCommand( { getlasterror : 1 , w : 2 , wtimeout : 3000 } ) +} + +am = m.getDB( "foo" ); +as = s.getDB( "foo" ); + +function run( createInBackground ) { + + collName = "foo" + ( createInBackground ? "B" : "F" ); + + am[collName].drop(); + am.blah.insert( { x : 1 } ) + assert.soon( function(){ + block(); + return as.blah.findOne(); + } + ); + + + for ( i=0; i<10; i++ ) { + am[collName].insert( { _id : i , x : Math.floor( i / 2 ) } ) + } + + block(); + + am.runCommand( { "godinsert" : collName , obj : { _id : 100 , x : 20 } } ); + am.runCommand( { "godinsert" : collName , obj : { _id : 101 , x : 20 } } ); + + as.runCommand( { "godinsert" : collName , obj : { _id : 101 , x : 20 } } ); + as.runCommand( { "godinsert" : collName , obj : { _id : 100 , x : 20 } } ); + + assert.eq( as[collName].count() , am[collName].count() ); + + function mymap(z) { + return z._id + ":" + z.x + ","; + } + + + if ( am.serverStatus().mem.bits == 64 ) { + assert.neq( tojson(am[collName].find().map(mymap)) , + tojson(as[collName].find().map(mymap)) , "order is not supposed to be same on master and slave but it is" ); + } + + + am[collName].ensureIndex( { x : 1 } , { unique : true , dropDups : true , background : createInBackground } ); + am.blah.insert( { x : 1 } ) + block(); + + assert.eq( 2 , am[collName].getIndexKeys().length , "A1 : " + createInBackground ) + assert.eq( 2 , as[collName].getIndexKeys().length , "A2 : " + createInBackground ) + + assert.eq( am[collName].find().sort( { _id : 1 } ).map(mymap) , + as[collName].find().sort( { _id : 1 } ).map(mymap) , "different things dropped on master and slave" ); + + +} + +run( false ) +run( true ) + +rt.stop() diff --git a/jstests/repl/mastermaster1.js b/jstests/repl/mastermaster1.js index 4932d5a..97fdc14 100644 --- a/jstests/repl/mastermaster1.js +++ b/jstests/repl/mastermaster1.js @@ -4,32 +4,45 @@ ports = allocatePorts( 2 ) left = startMongodTest( ports[0] , "mastermaster1left" , false , { master : "" , slave : "" , source : "127.0.0.1:" + ports[1] } ) -right = startMongodTest( ports[1] , "mastermaster1left" , false , { master : "" , slave : "" , source : "127.0.0.1:" + ports[0] } ) - -print( "check 1" ) x = left.getDB( "admin" ).runCommand( "ismaster" ) assert( x.ismaster , "left: " + tojson( x ) ) +right = startMongodTest( ports[1] , "mastermaster1right" , false , { master : "" , slave : "" , source : "127.0.0.1:" + ports[0] } ) + x = right.getDB( "admin" ).runCommand( "ismaster" ) assert( x.ismaster , "right: " + tojson( x ) ) +print( "check 1" ) + + ldb = left.getDB( "test" ) rdb = right.getDB( "test" ) print( "check 2" ) ldb.foo.insert( { _id : 1 , x : "eliot" } ) -var result = ldb.runCommand( { getlasterror : 1 , w : 2 , wtimeout : 20000 } ); +result = ldb.runCommand( { getlasterror : 1 , w : 2 , wtimeout : 40000 } ); printjson(result); rdb.foo.insert( { _id : 2 , x : "sara" } ) -result = rdb.runCommand( { getlasterror : 1 , w : 2 , wtimeout : 20000 } ) +result = rdb.runCommand( { getlasterror : 1 , w : 2 , wtimeout : 40000 } ) printjson(result); print( "check 3" ) +print( "left" ) +ldb.foo.find().forEach( printjsononeline ) +print( "right" ) +rdb.foo.find().forEach( printjsononeline ) + +print( "oplog" ) + +rdb.getSisterDB( "local" ).getCollection( "oplog.$main" ).find().forEach( printjsononeline ) + +/* assert.eq( 2 , ldb.foo.count() , "B1" ) assert.eq( 2 , rdb.foo.count() , "B2" ) +*/ print( "going to stop everything" ) diff --git a/jstests/repl/mod_move.js b/jstests/repl/mod_move.js new file mode 100644 index 0000000..d39e747 --- /dev/null +++ b/jstests/repl/mod_move.js @@ -0,0 +1,69 @@ + +// test repl basics +// data on master/slave is the same + +var rt = new ReplTest( "mod_move" ); + +m = rt.start( true , { oplogSize : 50 } ); + +function block(){ + am.runCommand( { getlasterror : 1 , w : 2 , wtimeout : 3000 } ) +} + +am = m.getDB( "foo" ); + +function check( note ){ + var start = new Date(); + var x,y; + while ( (new Date()).getTime() - start.getTime() < 5 * 60 * 1000 ){ + x = am.runCommand( "dbhash" ); + y = as.runCommand( "dbhash" ); + if ( x.md5 == y.md5 ) + return; + sleep( 200 ); + } + assert.eq( x.md5 , y.md5 , note ); +} + +// insert a lot of 'big' docs +// so when we delete them the small docs move here + +BIG = 100000; +N = BIG * 2; + +s : "asdasdasdasdasdasdasdadasdadasdadasdasdas" + +for ( i=0; i<BIG; i++ ) { + am.a.insert( { _id : i , s : 1 , x : 1 } ) +} +for ( ; i<N; i++ ) { + am.a.insert( { _id : i , s : 1 } ) +} +for ( i=0; i<BIG; i++ ) { + am.a.remove( { _id : i } ) +} +am.getLastError(); +assert.eq( BIG , am.a.count() ) + +assert.eq( 1 , am.a.stats().paddingFactor , "A2" ) + + +// start slave +s = rt.start( false ); +as = s.getDB( "foo" ); +for ( i=N-1; i>=BIG; i-- ) { + am.a.update( { _id : i } , { $set : { x : 1 } } ) + if ( i == N ) { + am.getLastError() + assert.lt( as.a.count() , BIG , "B1" ) + print( "NOW : " + as.a.count() ) + } +} + +check( "B" ) + +rt.stop(); + + + + diff --git a/jstests/repl/pair1.js b/jstests/repl/pair1.js deleted file mode 100644 index 84dd7b7..0000000 --- a/jstests/repl/pair1.js +++ /dev/null @@ -1,100 +0,0 @@ -// Basic pairing test - -var baseName = "jstests_pair1test"; - -debug = function( p ) { -// print( p ); -} - -ismaster = function( n ) { - var im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); -// print( "ismaster: " + tojson( im ) ); - assert( im, "command ismaster failed" ); - return im.ismaster; -} - -var writeOneIdx = 0; - -writeOne = function( n ) { - n.getDB( baseName ).z.save( { _id: new ObjectId(), i: ++writeOneIdx } ); -} - -getCount = function( n ) { - return n.getDB( baseName ).z.find( { i: writeOneIdx } ).toArray().length; -} - -checkWrite = function( m, s ) { - writeOne( m ); - assert.eq( 1, getCount( m ) ); - check( s ); -} - -check = function( s ) { - s.setSlaveOk(); - assert.soon( function() { - return 1 == getCount( s ); - } ); - sleep( 500 ); // wait for sync clone to finish up -} - -// check that slave reads and writes are guarded -checkSlaveGuard = function( s ) { - var t = s.getDB( baseName + "-temp" ).temp; - assert.throws( t.find().count, [], "not master" ); - assert.throws( t.find(), [], "not master", "find did not assert" ); - - checkError = function() { - assert.eq( "not master", s.getDB( "admin" ).getLastError() ); - s.getDB( "admin" ).resetError(); - } - s.getDB( "admin" ).resetError(); - t.save( {x:1} ); - checkError(); - t.update( {}, {x:2}, true ); - checkError(); - t.remove( {x:0} ); - checkError(); -} - -doTest = function( signal ) { - - ports = allocatePorts( 3 ); - - a = new MongodRunner( ports[ 0 ], "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( ports[ 1 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); - r = new MongodRunner( ports[ 2 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] ); - - rp = new ReplPair( l, r, a ); - rp.start(); - rp.waitForSteadyState(); - - checkSlaveGuard( rp.slave() ); - - checkWrite( rp.master(), rp.slave() ); - - debug( "kill first" ); - rp.killNode( rp.master(), signal ); - rp.waitForSteadyState( [ 1, null ], rp.slave().host ); - writeOne( rp.master() ); - - debug( "restart first" ); - rp.start( true ); - rp.waitForSteadyState(); - check( rp.slave() ); - checkWrite( rp.master(), rp.slave() ); - - debug( "kill second" ); - rp.killNode( rp.master(), signal ); - rp.waitForSteadyState( [ 1, null ], rp.slave().host ); - - debug( "restart second" ); - rp.start( true ); - rp.waitForSteadyState( [ 1, 0 ], rp.master().host ); - checkWrite( rp.master(), rp.slave() ); - - ports.forEach( function( x ) { stopMongod( x ); } ); - -} - -doTest( 15 ); // SIGTERM -doTest( 9 ); // SIGKILL diff --git a/jstests/repl/pair2.js b/jstests/repl/pair2.js deleted file mode 100644 index 2491fb2..0000000 --- a/jstests/repl/pair2.js +++ /dev/null @@ -1,71 +0,0 @@ -// Pairing resync - -var baseName = "jstests_pair2test"; - -ismaster = function( n ) { - im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); - assert( im ); - return im.ismaster; -} - -soonCount = function( m, count ) { - assert.soon( function() { -// print( "counting" ); -//// print( "counted: " + l.getDB( baseName ).z.find().count() ); - return m.getDB( baseName ).z.find().count() == count; - } ); -} - -doTest = function( signal ) { - - ports = allocatePorts( 3 ); - - a = new MongodRunner( ports[ 0 ], "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( ports[ 1 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); - r = new MongodRunner( ports[ 2 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] ); - - rp = new ReplPair( l, r, a ); - rp.start(); - rp.waitForSteadyState(); - - rp.slave().setSlaveOk(); - mz = rp.master().getDB( baseName ).z; - - mz.save( { _id: new ObjectId() } ); - soonCount( rp.slave(), 1 ); - assert.eq( 0, rp.slave().getDB( "admin" ).runCommand( { "resync" : 1 } ).ok ); - - sleep( 3000 ); // allow time to finish clone and save ReplSource - rp.killNode( rp.slave(), signal ); - rp.waitForSteadyState( [ 1, null ], rp.master().host ); - - big = new Array( 2000 ).toString(); - for( i = 0; i < 1000; ++i ) - mz.save( { _id: new ObjectId(), i: i, b: big } ); - - rp.start( true ); - rp.waitForSteadyState( [ 1, 0 ], rp.master().host ); - - sleep( 15000 ); - - rp.slave().setSlaveOk(); - assert.soon( function() { - ret = rp.slave().getDB( "admin" ).runCommand( { "resync" : 1 } ); -// printjson( ret ); - return 1 == ret.ok; - } ); - - sleep( 8000 ); - soonCount( rp.slave(), 1001 ); - sz = rp.slave().getDB( baseName ).z - assert.eq( 1, sz.find( { i: 0 } ).count() ); - assert.eq( 1, sz.find( { i: 999 } ).count() ); - - assert.eq( 0, rp.slave().getDB( "admin" ).runCommand( { "resync" : 1 } ).ok ); - - ports.forEach( function( x ) { stopMongod( x ); } ); - -} - -doTest( 15 ); // SIGTERM -doTest( 9 ); // SIGKILL diff --git a/jstests/repl/pair3.js b/jstests/repl/pair3.js deleted file mode 100644 index d5fdf7e..0000000 --- a/jstests/repl/pair3.js +++ /dev/null @@ -1,245 +0,0 @@ -// test arbitration - -var baseName = "jstests_pair3test"; - -ismaster = function( n ) { - var im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); - print( "ismaster: " + tojson( im ) ); - assert( im, "command ismaster failed" ); - return im.ismaster; -} - -// bring up node connections before arbiter connections so that arb can forward to node when expected -connect = function() { - if ( lp == null ) { - print("connecting lp"); - lp = startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort ); - } - if ( rp == null ) { - print("connecting rp"); - rp = startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort ); - } - if ( al == null ) { - print("connecting al"); - al = startMongoProgram( "mongobridge", "--port", alPort, "--dest", "localhost:" + aPort ); - } - if ( ar == null ) { - print("connecting ar"); - ar = startMongoProgram( "mongobridge", "--port", arPort, "--dest", "localhost:" + aPort ); - } -} - -disconnectNode = function( mongo ) { - if ( lp ) { - print("disconnecting lp: "+lpPort); - stopMongoProgram( lpPort ); - lp = null; - } - if ( rp ) { - print("disconnecting rp: "+rpPort); - stopMongoProgram( rpPort ); - rp = null; - } - if ( mongo.host.match( new RegExp( "^127.0.0.1:" + lPort + "$" ) ) ) { - print("disconnecting al: "+alPort); - stopMongoProgram( alPort ); - al = null; - } else if ( mongo.host.match( new RegExp( "^127.0.0.1:" + rPort + "$" ) ) ) { - print("disconnecting ar: "+arPort); - stopMongoProgram( arPort ); - ar = null; - } else { - assert( false, "don't know how to disconnect node: " + mongo ); - } -} - -doTest1 = function() { - al = ar = lp = rp = null; - ports = allocatePorts( 7 ); - aPort = ports[ 0 ]; - alPort = ports[ 1 ]; - arPort = ports[ 2 ]; - lPort = ports[ 3 ]; - lpPort = ports[ 4 ]; - rPort = ports[ 5 ]; - rpPort = ports[ 6 ]; - - connect(); - - a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort ); - r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort ); - - pair = new ReplPair( l, r, a ); - - print("normal startup"); - pair.start(); - pair.waitForSteadyState(); - - print("disconnect slave"); - disconnectNode( pair.slave() ); - pair.waitForSteadyState( [ 1, -3 ], pair.master().host ); - - print("disconnect master"); - disconnectNode( pair.master() ); - pair.waitForSteadyState( [ -3, -3 ] ); - - print("reconnect"); - connect(); - pair.waitForSteadyState(); - - print("disconnect master"); - disconnectNode( pair.master() ); - pair.waitForSteadyState( [ 1, -3 ], pair.slave().host, true ); - - print("disconnect new master"); - disconnectNode( pair.master() ); - pair.waitForSteadyState( [ -3, -3 ] ); - - print("reconnect"); - connect(); - pair.waitForSteadyState(); - - print("disconnect slave"); - disconnectNode( pair.slave() ); - pair.waitForSteadyState( [ 1, -3 ], pair.master().host ); - - print("reconnect slave"); - connect(); - pair.waitForSteadyState( [ 1, 0 ], pair.master().host ); - - print("disconnect master"); - disconnectNode( pair.master() ); - pair.waitForSteadyState( [ 1, -3 ], pair.slave().host, true ); - - print("reconnect old master"); - connect(); - pair.waitForSteadyState( [ 1, 0 ], pair.master().host ); - - ports.forEach( function( x ) { stopMongoProgram( x ); } ); -} - -// this time don't start connected -doTest2 = function() { - al = ar = lp = rp = null; - ports = allocatePorts( 7 ); - aPort = ports[ 0 ]; - alPort = ports[ 1 ]; - arPort = ports[ 2 ]; - lPort = ports[ 3 ]; - lpPort = ports[ 4 ]; - rPort = ports[ 5 ]; - rpPort = ports[ 6 ]; - - a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort ); - r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort ); - - pair = new ReplPair( l, r, a ); - pair.start(); - pair.waitForSteadyState( [ -3, -3 ] ); - - startMongoProgram( "mongobridge", "--port", arPort, "--dest", "localhost:" + aPort ); - - // there hasn't been an initial sync, no no node will become master - - for( i = 0; i < 10; ++i ) { - assert( pair.isMaster( pair.right() ) == -3 && pair.isMaster( pair.left() ) == -3 ); - sleep( 500 ); - } - - stopMongoProgram( arPort ); - - startMongoProgram( "mongobridge", "--port", alPort, "--dest", "localhost:" + aPort ); - - for( i = 0; i < 10; ++i ) { - assert( pair.isMaster( pair.right() ) == -3 && pair.isMaster( pair.left() ) == -3 ); - sleep( 500 ); - } - - stopMongoProgram( alPort ); - - // connect l and r without a - - startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort ); - startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort ); - - pair.waitForSteadyState( [ 1, 0 ] ); - - ports.forEach( function( x ) { stopMongoProgram( x ); } ); -} - -// recover from master - master setup -doTest3 = function() { - al = ar = lp = rp = null; - ports = allocatePorts( 7 ); - aPort = ports[ 0 ]; - alPort = ports[ 1 ]; - arPort = ports[ 2 ]; - lPort = ports[ 3 ]; - lpPort = ports[ 4 ]; - rPort = ports[ 5 ]; - rpPort = ports[ 6 ]; - - connect(); - - a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort ); - r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort ); - - pair = new ReplPair( l, r, a ); - pair.start(); - pair.waitForSteadyState(); - - // now can only talk to arbiter - stopMongoProgram( lpPort ); - stopMongoProgram( rpPort ); - pair.waitForSteadyState( [ 1, 1 ], null, true ); - - // recover - startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort ); - startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort ); - pair.waitForSteadyState( [ 1, 0 ], null, true ); - - ports.forEach( function( x ) { stopMongoProgram( x ); } ); -} - -// check that initial sync is persistent -doTest4 = function( signal ) { - al = ar = lp = rp = null; - ports = allocatePorts( 7 ); - aPort = ports[ 0 ]; - alPort = ports[ 1 ]; - arPort = ports[ 2 ]; - lPort = ports[ 3 ]; - lpPort = ports[ 4 ]; - rPort = ports[ 5 ]; - rpPort = ports[ 6 ]; - - connect(); - - a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + alPort ); - r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + arPort ); - - pair = new ReplPair( l, r, a ); - pair.start(); - pair.waitForSteadyState(); - - pair.killNode( pair.left(), signal ); - pair.killNode( pair.right(), signal ); - stopMongoProgram( rpPort ); - stopMongoProgram( lpPort ); - - // now can only talk to arbiter - pair.start( true ); - pair.waitForSteadyState( [ 1, 1 ], null, true ); - - ports.forEach( function( x ) { stopMongoProgram( x ); } ); -} - -doTest1(); -doTest2(); -doTest3(); -doTest4( 15 ); -doTest4( 9 ); diff --git a/jstests/repl/pair4.js b/jstests/repl/pair4.js deleted file mode 100644 index c04433e..0000000 --- a/jstests/repl/pair4.js +++ /dev/null @@ -1,160 +0,0 @@ -// data consistency after master-master - -var baseName = "jstests_pair4test"; - -debug = function( o ) { - printjson( o ); -} - -ismaster = function( n ) { - var im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); - print( "ismaster: " + tojson( im ) ); - assert( im, "command ismaster failed" ); - return im.ismaster; -} - -connect = function() { - startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort ); - startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort ); -} - -disconnect = function() { - stopMongoProgram( lpPort ); - stopMongoProgram( rpPort ); -} - -write = function( m, n, id ) { - if ( id ) { - save = { _id:id, n:n }; - } else { - save = { n:n }; - } - m.getDB( baseName ).getCollection( baseName ).save( save ); -} - -check = function( m, n, id ) { - m.setSlaveOk(); - if ( id ) { - find = { _id:id, n:n }; - } else { - find = { n:n }; - } - assert.soon( function() { return m.getDB( baseName ).getCollection( baseName ).find( find ).count() > 0; }, - "failed waiting for " + m + " value of n to be " + n ); -} - -checkCount = function( m, c ) { - m.setSlaveOk(); - assert.soon( function() { - actual = m.getDB( baseName ).getCollection( baseName ).find().count(); - print( actual ); - return c == actual; }, - "count failed for " + m ); -} - -coll = function( m ) { - return m.getDB( baseName ).getCollection( baseName ); -} - -db2Coll = function( m ) { - return m.getDB( baseName + "_second" ).getCollection( baseName ); -} - -doTest = function( recover, newMaster, newSlave ) { - ports = allocatePorts( 5 ); - aPort = ports[ 0 ]; - lPort = ports[ 1 ]; - lpPort = ports[ 2 ]; - rPort = ports[ 3 ]; - rpPort = ports[ 4 ]; - - // start normally - connect(); - a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + aPort ); - r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + aPort ); - pair = new ReplPair( l, r, a ); - pair.start(); - pair.waitForSteadyState(); - - firstMaster = pair.master(); - firstSlave = pair.slave(); - - write( pair.master(), 0 ); - write( pair.master(), 1 ); - check( pair.slave(), 0 ); - check( pair.slave(), 1 ); - - // now each can only talk to arbiter - disconnect(); - pair.waitForSteadyState( [ 1, 1 ], null, true ); - - m = newMaster(); - write( m, 10 ); - write( m, 100, "a" ); - coll( m ).update( {n:1}, {$set:{n:2}} ); - db2Coll( m ).save( {n:500} ); - db2Coll( m ).findOne(); - - s = newSlave(); - write( s, 20 ); - write( s, 200, "a" ); - coll( s ).update( {n:1}, {n:1,m:3} ); - db2Coll( s ).save( {_id:"a",n:600} ); - db2Coll( s ).findOne(); - - // recover - recover(); - - nodes = [ pair.right(), pair.left() ]; - - nodes.forEach( function( x ) { checkCount( x, 5 ); } ); - nodes.forEach( function( x ) { [ 0, 10, 20, 100 ].forEach( function( y ) { check( x, y ); } ); } ); - - checkM = function( c ) { - assert.soon( function() { - obj = coll( c ).findOne( {n:2} ); - printjson( obj ); - return obj.m == undefined; - }, "n:2 test for " + c + " failed" ); - }; - nodes.forEach( function( x ) { checkM( x ); } ); - - // check separate database - nodes.forEach( function( x ) { assert.soon( function() { - r = db2Coll( x ).findOne( {_id:"a"} ); - debug( r ); - if ( r == null ) { - return false; - } - return 600 == r.n; - } ) } ); - - ports.forEach( function( x ) { stopMongoProgram( x ); } ); - -} - -// right will be master on recovery b/c both sides will have completed initial sync -debug( "basic test" ); -doTest( function() { - connect(); - pair.waitForSteadyState( [ 1, 0 ], pair.right().host, true ); - }, function() { return pair.right(); }, function() { return pair.left(); } ); - -doRestartTest = function( signal ) { - doTest( function() { - if ( signal == 9 ) { - sleep( 3000 ); - } - pair.killNode( firstMaster, signal ); - connect(); - pair.start( true ); - pair.waitForSteadyState( [ 1, 0 ], firstSlave.host, true ); - }, function() { return firstSlave; }, function() { return firstMaster; } ); -} - -debug( "sigterm restart test" ); -doRestartTest( 15 ) // SIGTERM - -debug( "sigkill restart test" ); -doRestartTest( 9 ) // SIGKILL diff --git a/jstests/repl/pair5.js b/jstests/repl/pair5.js deleted file mode 100644 index de7e2d5..0000000 --- a/jstests/repl/pair5.js +++ /dev/null @@ -1,95 +0,0 @@ -// writes to new master while making master-master logs consistent - -var baseName = "jstests_pair5test"; - -debug = function( p ) { - print( p ); -} - -ismaster = function( n ) { - var im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); - print( "ismaster: " + tojson( im ) ); - assert( im, "command ismaster failed" ); - return im.ismaster; -} - -connect = function() { - startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort ); - startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort ); -} - -disconnect = function() { - stopMongoProgram( lpPort ); - stopMongoProgram( rpPort ); -} - -write = function( m, n, id ) { - if ( id ) { - save = { _id:id, n:n }; - } else { - save = { n:n }; - } - m.getDB( baseName ).getCollection( baseName ).save( save ); -} - -checkCount = function( m, c ) { - m.setSlaveOk(); - assert.soon( function() { - actual = m.getDB( baseName ).getCollection( baseName ).find().count(); - print( actual ); - return c == actual; }, - "count failed for " + m ); -} - -doTest = function( nSlave, opIdMem ) { - ports = allocatePorts( 5 ); - aPort = ports[ 0 ]; - lPort = ports[ 1 ]; - lpPort = ports[ 2 ]; - rPort = ports[ 3 ]; - rpPort = ports[ 4 ]; - - // start normally - connect(); - a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + aPort ); - r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + aPort ); - pair = new ReplPair( l, r, a ); - pair.start(); - pair.waitForSteadyState(); - - // now each can only talk to arbiter - disconnect(); - pair.waitForSteadyState( [ 1, 1 ], null, true ); - - // left will become slave (b/c both completed initial sync) - for( i = 0; i < nSlave; ++i ) { - write( pair.left(), i, i ); - } - pair.left().getDB( baseName ).getCollection( baseName ).findOne(); - - for( i = 10000; i < 15000; ++i ) { - write( pair.right(), i, i ); - } - pair.right().getDB( baseName ).getCollection( baseName ).findOne(); - - connect(); - pair.waitForSteadyState( [ 1, 0 ], pair.right().host, true ); - - pair.master().getDB( baseName ).getCollection( baseName ).update( {_id:nSlave - 1}, {_id:nSlave - 1,n:-1}, true ); - assert.eq( -1, pair.master().getDB( baseName ).getCollection( baseName ).findOne( {_id:nSlave - 1} ).n ); - checkCount( pair.master(), 5000 + nSlave ); - assert.eq( -1, pair.master().getDB( baseName ).getCollection( baseName ).findOne( {_id:nSlave - 1} ).n ); - pair.slave().setSlaveOk(); - assert.soon( function() { - n = pair.slave().getDB( baseName ).getCollection( baseName ).findOne( {_id:nSlave - 1} ).n; - print( n ); - return -1 == n; - } ); - - ports.forEach( function( x ) { stopMongoProgram( x ); } ); - -} - -doTest( 5000, 100000000 ); -doTest( 5000, 100 ); // force op id converstion to collection based storage diff --git a/jstests/repl/pair6.js b/jstests/repl/pair6.js deleted file mode 100644 index b249fc0..0000000 --- a/jstests/repl/pair6.js +++ /dev/null @@ -1,115 +0,0 @@ -// pairing cases where oplogs run out of space - -var baseName = "jstests_pair6test"; - -debug = function( p ) { - print( p ); -} - -ismaster = function( n ) { - var im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); - print( "ismaster: " + tojson( im ) ); - assert( im, "command ismaster failed" ); - return im.ismaster; -} - -connect = function() { - startMongoProgram( "mongobridge", "--port", lpPort, "--dest", "localhost:" + lPort ); - startMongoProgram( "mongobridge", "--port", rpPort, "--dest", "localhost:" + rPort ); -} - -disconnect = function() { - stopMongoProgram( lpPort ); - stopMongoProgram( rpPort ); -} - -checkCount = function( m, c ) { - m.setSlaveOk(); - assert.soon( function() { - actual = m.getDB( baseName ).getCollection( baseName ).find().count(); - print( actual ); - return c == actual; }, - "expected count " + c + " for " + m ); -} - -resetSlave = function( s ) { - s.setSlaveOk(); - assert.soon( function() { - ret = s.getDB( "admin" ).runCommand( { "resync" : 1 } ); - // printjson( ret ); - return 1 == ret.ok; - } ); -} - -big = new Array( 2000 ).toString(); - -doTest = function() { - ports = allocatePorts( 5 ); - aPort = ports[ 0 ]; - lPort = ports[ 1 ]; - lpPort = ports[ 2 ]; - rPort = ports[ 3 ]; - rpPort = ports[ 4 ]; - - // start normally - connect(); - a = new MongodRunner( aPort, "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( lPort, "/data/db/" + baseName + "-left", "127.0.0.1:" + rpPort, "127.0.0.1:" + aPort ); - r = new MongodRunner( rPort, "/data/db/" + baseName + "-right", "127.0.0.1:" + lpPort, "127.0.0.1:" + aPort ); - pair = new ReplPair( l, r, a ); - pair.start(); - pair.waitForSteadyState(); - - disconnect(); - pair.waitForSteadyState( [ 1, 1 ], null, true ); - - print( "test one" ); - - // fill new slave oplog - for( i = 0; i < 1000; ++i ) { - pair.left().getDB( baseName ).getCollection( baseName ).save( {b:big} ); - } - pair.left().getDB( baseName ).getCollection( baseName ).findOne(); - - // write single to new master - pair.right().getDB( baseName ).getCollection( baseName ).save( {} ); - - connect(); - pair.waitForSteadyState( [ 1, 0 ], pair.right().host, true ); - - resetSlave( pair.left() ); - - checkCount( pair.left(), 1 ); - checkCount( pair.right(), 1 ); - - pair.right().getDB( baseName ).getCollection( baseName ).remove( {} ); - checkCount( pair.left(), 0 ); - - disconnect(); - pair.waitForSteadyState( [ 1, 1 ], null, true ); - - print( "test two" ); - - // fill new master oplog - for( i = 0; i < 1000; ++i ) { - pair.right().getDB( baseName ).getCollection( baseName ).save( {b:big} ); - } - - pair.left().getDB( baseName ).getCollection( baseName ).save( {_id:"abcde"} ); - - connect(); - pair.waitForSteadyState( [ 1, 0 ], pair.right().host, true ); - - sleep( 15000 ); - - resetSlave( pair.left() ); - - checkCount( pair.left(), 1000 ); - checkCount( pair.right(), 1000 ); - assert.eq( 0, pair.left().getDB( baseName ).getCollection( baseName ).find( {_id:"abcde"} ).count() ); - - ports.forEach( function( x ) { stopMongoProgram( x ); } ); - -} - -doTest();
\ No newline at end of file diff --git a/jstests/repl/pair7.js b/jstests/repl/pair7.js deleted file mode 100644 index 52ef91f..0000000 --- a/jstests/repl/pair7.js +++ /dev/null @@ -1,85 +0,0 @@ -// pairing with auth - -var baseName = "jstests_pair7test"; - -setAdmin = function( n ) { - n.getDB( "admin" ).addUser( "super", "super" ); - n.getDB( "local" ).addUser( "repl", "foo" ); - n.getDB( "local" ).system.users.findOne(); -} - -auth = function( n ) { - return n.getDB( baseName ).auth( "test", "test" ); -} - -doTest = function( signal ) { - - ports = allocatePorts( 3 ); - - m = startMongod( "--port", ports[ 1 ], "--dbpath", "/data/db/" + baseName + "-left", "--nohttpinterface", "--bind_ip", "127.0.0.1" ); - setAdmin( m ); - stopMongod( ports[ 1 ] ); - - m = startMongod( "--port", ports[ 2 ], "--dbpath", "/data/db/" + baseName + "-right", "--nohttpinterface", "--bind_ip", "127.0.0.1" ); - setAdmin( m ); - stopMongod( ports[ 2 ] ); - - a = new MongodRunner( ports[ 0 ], "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( ports[ 1 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ], [ "--auth" ] ); - r = new MongodRunner( ports[ 2 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ], [ "--auth" ] ); - - rp = new ReplPair( l, r, a ); - rp.start( true ); - rp.waitForSteadyState(); - - rp.master().getDB( "admin" ).auth( "super", "super" ); - rp.master().getDB( baseName ).addUser( "test", "test" ); - auth( rp.master() ); // reauth - assert.soon( function() { return auth( rp.slave() ); } ); - rp.slave().setSlaveOk(); - - ma = rp.master().getDB( baseName ).a; - ma.save( {} ); - sa = rp.slave().getDB( baseName ).a; - assert.soon( function() { return 1 == sa.count(); } ); - - rp.killNode( rp.slave(), signal ); - rp.waitForSteadyState( [ 1, null ] ); - ma.save( {} ); - - rp.start( true ); - rp.waitForSteadyState(); - assert.soon( function() { return auth( rp.slave() ); } ); - rp.slave().setSlaveOk(); - sa = rp.slave().getDB( baseName ).a; - assert.soon( function() { return 2 == sa.count(); } ); - - ma.save( {a:1} ); - assert.soon( function() { return 1 == sa.count( {a:1} ); } ); - - ma.update( {a:1}, {b:2} ); - assert.soon( function() { return 1 == sa.count( {b:2} ); } ); - - ma.remove( {b:2} ); - assert.soon( function() { return 0 == sa.count( {b:2} ); } ); - - rp.killNode( rp.master(), signal ); - rp.waitForSteadyState( [ 1, null ] ); - ma = sa; - ma.save( {} ); - - rp.start( true ); - rp.waitForSteadyState(); - assert.soon( function() { return auth( rp.slave() ); } ); - rp.slave().setSlaveOk(); - sa = rp.slave().getDB( baseName ).a; - assert.soon( function() { return 3 == sa.count(); } ); - - ma.save( {} ); - assert.soon( function() { return 4 == sa.count(); } ); - - ports.forEach( function( x ) { stopMongod( x ); } ); -} - -doTest( 15 ); // SIGTERM -doTest( 9 ); // SIGKILL diff --git a/jstests/repl/repl2.js b/jstests/repl/repl2.js index 42b0caf..b290c61 100644 --- a/jstests/repl/repl2.js +++ b/jstests/repl/repl2.js @@ -1,34 +1,43 @@ // Test resync command soonCount = function( count ) { - assert.soon( function() { + assert.soon( function() { // print( "check count" ); // print( "count: " + s.getDB( baseName ).z.find().count() ); - return s.getDB("foo").a.find().count() == count; - } ); + return s.getDB("foo").a.find().count() == count; + } ); } doTest = function( signal ) { - + print("signal: "+signal); + var rt = new ReplTest( "repl2tests" ); // implicit small oplog makes slave get out of sync - m = rt.start( true ); + m = rt.start( true, { oplogSize : "1" } ); s = rt.start( false ); - + am = m.getDB("foo").a - + am.save( { _id: new ObjectId() } ); soonCount( 1 ); assert.eq( 0, s.getDB( "admin" ).runCommand( { "resync" : 1 } ).ok ); rt.stop( false , signal ); - + big = new Array( 2000 ).toString(); for( i = 0; i < 1000; ++i ) am.save( { _id: new ObjectId(), i: i, b: big } ); s = rt.start( false , null , true ); - assert.soon( function() { return 1 == s.getDB( "admin" ).runCommand( { "resync" : 1 } ).ok; } ); + + print("earliest op in master: "+tojson(m.getDB("local").oplog.$main.find().sort({$natural:1}).limit(1).next())); + print("latest op on slave: "+tojson(s.getDB("local").sources.findOne())); + + assert.soon( function() { + var result = s.getDB( "admin" ).runCommand( { "resync" : 1 } ); + print("resync says: "+tojson(result)); + return result.ok == 1; + } ); soonCount( 1001 ); assert.automsg( "m.getDB( 'local' ).getCollection( 'oplog.$main' ).stats().size > 0" ); @@ -36,7 +45,7 @@ doTest = function( signal ) { as = s.getDB("foo").a assert.eq( 1, as.find( { i: 0 } ).count() ); assert.eq( 1, as.find( { i: 999 } ).count() ); - + assert.eq( 0, s.getDB( "admin" ).runCommand( { "resync" : 1 } ).ok ); rt.stop(); diff --git a/jstests/repl/repl3.js b/jstests/repl/repl3.js index d3c3848..5ace9b6 100644 --- a/jstests/repl/repl3.js +++ b/jstests/repl/repl3.js @@ -10,38 +10,42 @@ soonCount = function( count ) { } ); } -doTest = function( signal ) { - - rt = new ReplTest( "repl3tests" ); - - m = rt.start( true ); - s = rt.start( false ); - - am = m.getDB( baseName ).a - - am.save( { _id: new ObjectId() } ); - soonCount( 1 ); - rt.stop( false, signal ); - - big = new Array( 2000 ).toString(); - for( i = 0; i < 1000; ++i ) - am.save( { _id: new ObjectId(), i: i, b: big } ); - - s = rt.start( false, { autoresync: null }, true ); - +doTest = function (signal) { + + print("repl3.js doTest(" + signal + ")") + + rt = new ReplTest("repl3tests"); + + m = rt.start(true); + s = rt.start(false); + + am = m.getDB(baseName).a + + am.save({ _id: new ObjectId() }); + soonCount(1); + rt.stop(false, signal); + + big = new Array(2000).toString(); + for (i = 0; i < 1000; ++i) + am.save({ _id: new ObjectId(), i: i, b: big }); + + s = rt.start(false, { autoresync: null }, true); + // after SyncException, mongod waits 10 secs. - sleep( 15000 ); - + sleep(15000); + // Need the 2 additional seconds timeout, since commands don't work on an 'allDead' node. - soonCount( 1001 ); - as = s.getDB( baseName ).a - assert.eq( 1, as.find( { i: 0 } ).count() ); - assert.eq( 1, as.find( { i: 999 } ).count() ); - - assert.commandFailed( s.getDB( "admin" ).runCommand( { "resync" : 1 } ) ); + soonCount(1001); + as = s.getDB(baseName).a + assert.eq(1, as.find({ i: 0 }).count()); + assert.eq(1, as.find({ i: 999 }).count()); + + assert.commandFailed(s.getDB("admin").runCommand({ "resync": 1 })); rt.stop(); } doTest( 15 ); // SIGTERM doTest( 9 ); // SIGKILL + +print("repl3.js OK") diff --git a/jstests/repl/replacePeer1.js b/jstests/repl/replacePeer1.js deleted file mode 100644 index b3743ce..0000000 --- a/jstests/repl/replacePeer1.js +++ /dev/null @@ -1,82 +0,0 @@ -// test replace peer on master - -var baseName = "jstests_replacepeer1test"; - -ismaster = function( n ) { - im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); -// print( "ismaster: " + tojson( im ) ); - assert( im ); - return im.ismaster; -} - -var writeOneIdx = 0; - -writeOne = function( n ) { - n.getDB( baseName ).z.save( { _id: new ObjectId(), i: ++writeOneIdx } ); -} - -getCount = function( n ) { - return n.getDB( baseName ).z.find( { i: writeOneIdx } ).toArray().length; -} - -checkWrite = function( m, s ) { - writeOne( m ); - assert.eq( 1, getCount( m ) ); - s.setSlaveOk(); - assert.soon( function() { - return 1 == getCount( s ); - } ); -} - -doTest = function( signal ) { - - ports = allocatePorts( 4 ); - - a = new MongodRunner( ports[ 0 ], "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( ports[ 1 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 3 ], "127.0.0.1:" + ports[ 0 ] ); - r = new MongodRunner( ports[ 3 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] ); - - rp = new ReplPair( l, r, a ); - rp.start(); - rp.waitForSteadyState( [ 1, 0 ] ); - rightMaster = ( rp.master().host == rp.right().host ); - - checkWrite( rp.master(), rp.slave() ); - - rp.killNode( rp.slave(), signal ); - - writeOne( rp.master() ); - - assert.commandWorked( rp.master().getDB( "admin" ).runCommand( {replacepeer:1} ) ); - - rp.killNode( rp.master(), signal ); - rp.killNode( rp.arbiter(), signal ); - - if ( rightMaster ) { - o = new MongodRunner( ports[ 2 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 3 ], "127.0.0.1:" + ports[ 0 ] ); - r = new MongodRunner( ports[ 3 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); - rp = new ReplPair( o, r, a ); - resetDbpath( "/data/db/" + baseName + "-left" ); - } else { - l = new MongodRunner( ports[ 1 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); - o = new MongodRunner( ports[ 2 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] ); - rp = new ReplPair( l, o, a ); - resetDbpath( "/data/db/" + baseName + "-right" ); - } - - rp.start( true ); - rp.waitForSteadyState( [ 1, 0 ] ); - - rp.slave().setSlaveOk(); - assert.eq( 2, rp.master().getDB( baseName ).z.find().toArray().length ); - assert.eq( 2, rp.slave().getDB( baseName ).z.find().toArray().length ); - - checkWrite( rp.master(), rp.slave() ); - assert.eq( 3, rp.slave().getDB( baseName ).z.find().toArray().length ); - - ports.forEach( function( x ) { stopMongod( x ); } ); - -} - -doTest( 15 ); // SIGTERM -doTest( 9 ); // SIGKILL diff --git a/jstests/repl/replacePeer2.js b/jstests/repl/replacePeer2.js deleted file mode 100644 index 33b054a..0000000 --- a/jstests/repl/replacePeer2.js +++ /dev/null @@ -1,86 +0,0 @@ -// test replace peer on slave - -var baseName = "jstests_replacepeer2test"; - -ismaster = function( n ) { - im = n.getDB( "admin" ).runCommand( { "ismaster" : 1 } ); -// print( "ismaster: " + tojson( im ) ); - assert( im ); - return im.ismaster; -} - -var writeOneIdx = 0; - -writeOne = function( n ) { - n.getDB( baseName ).z.save( { _id: new ObjectId(), i: ++writeOneIdx } ); -} - -getCount = function( n ) { - return n.getDB( baseName ).z.find( { i: writeOneIdx } ).toArray().length; -} - -checkWrite = function( m, s ) { - writeOne( m ); - assert.eq( 1, getCount( m ) ); - s.setSlaveOk(); - assert.soon( function() { - return 1 == getCount( s ); - } ); -} - -doTest = function( signal ) { - - ports = allocatePorts( 4 ); - - a = new MongodRunner( ports[ 0 ], "/data/db/" + baseName + "-arbiter" ); - l = new MongodRunner( ports[ 1 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 3 ], "127.0.0.1:" + ports[ 0 ] ); - r = new MongodRunner( ports[ 3 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] ); - - rp = new ReplPair( l, r, a ); - rp.start(); - rp.waitForSteadyState( [ 1, 0 ] ); - leftSlave = ( rp.slave().host == rp.left().host ); - - checkWrite( rp.master(), rp.slave() ); - - // allow slave to finish initial sync - var res = rp.slave().getDB( "admin" ).runCommand( {replacepeer:1} ); - assert( res.ok , "replacepeer didn't finish: " + tojson( res ) ); - - // Should not be saved to slave. - writeOne( rp.master() ); - // Make sure there would be enough time to save to l if we hadn't called replacepeer. - sleep( 10000 ); - - ports.forEach( function( x ) { stopMongod( x, signal ); } ); - - if ( leftSlave ) { - l = new MongodRunner( ports[ 1 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); - o = new MongodRunner( ports[ 2 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] ); - rp = new ReplPair( l, o, a ); - resetDbpath( "/data/db/" + baseName + "-right" ); - } else { - o = new MongodRunner( ports[ 2 ], "/data/db/" + baseName + "-left", "127.0.0.1:" + ports[ 3 ], "127.0.0.1:" + ports[ 0 ] ); - r = new MongodRunner( ports[ 3 ], "/data/db/" + baseName + "-right", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); - rp = new ReplPair( o, r, a ); - resetDbpath( "/data/db/" + baseName + "-left" ); - } - - rp.start( true ); - rp.waitForSteadyState( [ 1, 0 ] ); - - rp.slave().setSlaveOk(); - assert.eq( 1, rp.slave().getDB( baseName ).z.find().toArray().length ); - assert.eq( 1, rp.master().getDB( baseName ).z.find().toArray().length ); - - checkWrite( rp.master(), rp.slave() ); - assert.eq( 2, rp.slave().getDB( baseName ).z.find().toArray().length ); - - ports.forEach( function( x ) { stopMongod( x ); } ); - -} - -doTest( 15 ); // SIGTERM -doTest( 9 ); // SIGKILL - -print("replace2Peer finishes"); diff --git a/jstests/repl/snapshot2.js b/jstests/repl/snapshot2.js deleted file mode 100644 index 60b3531..0000000 --- a/jstests/repl/snapshot2.js +++ /dev/null @@ -1,72 +0,0 @@ -// Test SERVER-623 - starting repl peer from a new snapshot of master
-
-print("snapshot2.js 1 -----------------------------------------------------------"); - -ports = allocatePorts( 3 ); - -var baseName = "repl_snapshot2"; -var basePath = "/data/db/" + baseName; - -a = new MongodRunner( ports[ 0 ], basePath + "-arbiter" ); -l = new MongodRunner( ports[ 1 ], basePath + "-left", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); -r = new MongodRunner( ports[ 2 ], basePath + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] );
-
-print("snapshot2.js 2 -----------------------------------------------------------");
- -rp = new ReplPair(l, r, a); -rp.start();
-print("snapshot2.js 3 -----------------------------------------------------------");
-rp.waitForSteadyState();
-
-print("snapshot2.js 4 -----------------------------------------------------------"); - -big = new Array( 2000 ).toString(); // overflow oplog, so test can't pass supriously -rp.slave().setSlaveOk();
-print("snapshot2.js 5 -----------------------------------------------------------");
-for (i = 0; i < 500; ++i) { - rp.master().getDB( baseName )[ baseName ].save( { _id: new ObjectId(), i: i, b: big } );
- if (i % 250 == 249) {
- function p() { return i + 1 == rp.slave().getDB(baseName)[baseName].count(); }
- try {
- assert.soon(p);
- } catch (e) {
- print("\n\n\nsnapshot2.js\ni+1:" + (i + 1));
- print("slave count:" + rp.slave().getDB(baseName)[baseName].count());
- sleep(2000);
- print(p());
- throw (e); - } - sleep( 10 ); // give master a chance to grab a sync point - have such small oplogs the master log might overflow otherwise - } -}
-print("snapshot2.js 6 -----------------------------------------------------------"); - -rp.master().getDB( "admin" ).runCommand( {fsync:1,lock:1} ); -leftMaster = ( rp.master().host == rp.left().host ); -rp.killNode( rp.slave() ); -if ( leftMaster ) { - copyDbpath( basePath + "-left", basePath + "-right" ); -} else { - copyDbpath( basePath + "-right", basePath + "-left" ); -} -rp.master().getDB( "admin" ).$cmd.sys.unlock.findOne(); -rp.killNode( rp.master() ); - -clearRawMongoProgramOutput(); - -rp.right_.extraArgs_ = [ "--fastsync" ]; -rp.left_.extraArgs_ = [ "--fastsync" ]; - -rp.start( true ); -rp.waitForSteadyState(); -assert.eq( 500, rp.master().getDB( baseName )[ baseName ].count() ); -rp.slave().setSlaveOk(); -assert.eq( 500, rp.slave().getDB( baseName )[ baseName ].count() ); -rp.master().getDB( baseName )[ baseName ].save( {i:500} ); -assert.soon( function() { return 501 == rp.slave().getDB( baseName )[ baseName ].count(); } ); - -assert( !rawMongoProgramOutput().match( /resync/ ) );
-assert(!rawMongoProgramOutput().match(/SyncException/));
-
-print("snapshot2.js SUCCESS ----------------");
-
diff --git a/jstests/repl/snapshot3.js b/jstests/repl/snapshot3.js deleted file mode 100644 index 02955e5..0000000 --- a/jstests/repl/snapshot3.js +++ /dev/null @@ -1,53 +0,0 @@ -// Test SERVER-623 - starting repl peer from a new snapshot of slave - -ports = allocatePorts( 3 ); - -var baseName = "repl_snapshot3"; -var basePath = "/data/db/" + baseName; - -a = new MongodRunner( ports[ 0 ], basePath + "-arbiter" ); -l = new MongodRunner( ports[ 1 ], basePath + "-left", "127.0.0.1:" + ports[ 2 ], "127.0.0.1:" + ports[ 0 ] ); -r = new MongodRunner( ports[ 2 ], basePath + "-right", "127.0.0.1:" + ports[ 1 ], "127.0.0.1:" + ports[ 0 ] ); - -rp = new ReplPair( l, r, a ); -rp.start(); -rp.waitForSteadyState(); - -big = new Array( 2000 ).toString(); // overflow oplog, so test can't pass supriously -rp.slave().setSlaveOk(); -for( i = 0; i < 500; ++i ) { - rp.master().getDB( baseName )[ baseName ].save( { _id: new ObjectId(), i: i, b: big } ); - if ( i % 250 == 249 ) { - assert.soon( function() { return i+1 == rp.slave().getDB( baseName )[ baseName ].count(); } ); - sleep( 10 ); // give master a chance to grab a sync point - have such small oplogs the master log might overflow otherwise - } -} - -rp.slave().getDB( "admin" ).runCommand( {fsync:1,lock:1} ); -leftSlave = ( rp.slave().host == rp.left().host ); -rp.killNode( rp.master() ); -if ( leftSlave ) { - copyDbpath( basePath + "-left", basePath + "-right" ); -} else { - copyDbpath( basePath + "-right", basePath + "-left" ); -} -rp.slave().getDB( "admin" ).$cmd.sys.unlock.findOne(); -rp.killNode( rp.slave() ); - -clearRawMongoProgramOutput(); - -rp.right_.extraArgs_ = [ "--fastsync" ]; -rp.left_.extraArgs_ = [ "--fastsync" ]; - -rp.start( true ); -rp.waitForSteadyState(); -assert.eq( 500, rp.master().getDB( baseName )[ baseName ].count() ); -rp.slave().setSlaveOk(); -assert.eq( 500, rp.slave().getDB( baseName )[ baseName ].count() ); -rp.master().getDB( baseName )[ baseName ].save( {i:500} ); -assert.soon( function() { return 501 == rp.slave().getDB( baseName )[ baseName ].count(); } ); - -assert( !rawMongoProgramOutput().match( new RegExp( "resync.*" + baseName + ".*\n" ) ) , "last1" ); -assert( !rawMongoProgramOutput().match( /SyncException/ ) , "last2" ); - -print("snapshot3.js finishes"); |