diff --git a/jstests/repl/repl1.js b/jstests/repl/repl1.js index 4ae7008c4b6..455b29baa0d 100644 --- a/jstests/repl/repl1.js +++ b/jstests/repl/repl1.js @@ -15,10 +15,12 @@ soonCount = function( count ) { } doTest = function( signal ) { + + ports = allocatePorts( 2 ); // spec small oplog for fast startup on 64bit machines - m = startMongod( "--port", "27018", "--dbpath", "/data/db/" + baseName + "-master", "--master", "--oplogSize", "1" ); - s = startMongod( "--port", "27019", "--dbpath", "/data/db/" + baseName + "-slave", "--slave", "--source", "127.0.0.1:27018" ); + m = startMongod( "--port", ports[ 0 ], "--dbpath", "/data/db/" + baseName + "-master", "--master", "--oplogSize", "1" ); + s = startMongod( "--port", ports[ 1 ], "--dbpath", "/data/db/" + baseName + "-slave", "--slave", "--source", "127.0.0.1:" + ports[ 0 ] ); am = m.getDB( baseName ).a @@ -30,21 +32,21 @@ doTest = function( signal ) { assert.eq( 1, as.find( { i: 0 } ).count() ); assert.eq( 1, as.find( { i: 999 } ).count() ); - stopMongod( 27019, signal ); + stopMongod( ports[ 1 ], signal ); sleep( 2000 ); for( i = 1000; i < 1010; ++i ) am.save( { _id: new ObjectId(), i: i } ); - s = startMongoProgram( "mongod", "--port", "27019", "--dbpath", "/data/db/" + baseName + "-slave", "--slave", "--source", "127.0.0.1:27018" ); + s = startMongoProgram( "mongod", "--port", ports[ 1 ], "--dbpath", "/data/db/" + baseName + "-slave", "--slave", "--source", "127.0.0.1:" + ports[ 0 ] ); soonCount( 1010 ); as = s.getDB( baseName ).a assert.eq( 1, as.find( { i: 1009 } ).count() ); - stopMongod( 27018, signal ); + stopMongod( ports[ 0 ], signal ); sleep( 2000 ); - m = startMongoProgram( "mongod", "--port", "27018", "--dbpath", "/data/db/" + baseName + "-master", "--master", "--oplogSize", "1" ); + m = startMongoProgram( "mongod", "--port", ports[ 0 ], "--dbpath", "/data/db/" + baseName + "-master", "--master", "--oplogSize", "1" ); am = m.getDB( baseName ).a for( i = 1010; i < 1020; ++i ) @@ -53,8 +55,6 @@ doTest = function( signal ) { assert.soon( function() { return as.find().count() == 1020; } ); assert.eq( 1, as.find( { i: 1019 } ).count() ); - stopMongod( 27018 ); - stopMongod( 27019 ); } doTest( 15 ); // SIGTERM diff --git a/shell/ShellUtils.cpp b/shell/ShellUtils.cpp index 7b0647c13f5..e12571287dd 100644 --- a/shell/ShellUtils.cpp +++ b/shell/ShellUtils.cpp @@ -9,6 +9,8 @@ #include #include #include +#include +#include using namespace std; using namespace v8; @@ -535,6 +537,35 @@ Handle< Value > ThreadInject( const Arguments &args ) { return v8::Undefined(); } +Handle< Value > AllocatePorts( const Arguments &args ) { + jsassert( args.Length() == 1 , "allocatePorts takes exactly 1 argument" ); + jsassert( args[0]->IsInt32() , "allocatePorts needs to be passed an integer" ); + + int n = args[0]->ToInt32()->Value(); + + Local< Array > ret = Array::New( n ); + for( int i = 0; i < n; ++i ) { + int s = socket( AF_INET, SOCK_STREAM, 0 ); + assert( s ); + + sockaddr_in address; + memset(address.sin_zero, 0, sizeof(address.sin_zero)); + address.sin_family = AF_INET; + address.sin_port = 0; + address.sin_addr.s_addr = 0; + assert( 0 == bind( s, (sockaddr*)&address, sizeof( address ) ) ); + + sockaddr_in newAddress; + socklen_t len = sizeof( newAddress ); + assert( 0 == getsockname( s, (sockaddr*)&newAddress, &len ) ); + ret->Set( Number::New( i ), Number::New( ntohs( newAddress.sin_port ) ) ); + + assert( 0 == close( s ) ); + } + + return ret; +} + void installShellUtils( Handle& global ){ global->Set(v8::String::New("sleep"), v8::FunctionTemplate::New(JSSleep)); global->Set(v8::String::New("print"), v8::FunctionTemplate::New(Print)); @@ -543,6 +574,7 @@ void installShellUtils( Handle& global ){ global->Set(v8::String::New("quit"), v8::FunctionTemplate::New(Quit)); global->Set(v8::String::New("version"), v8::FunctionTemplate::New(Version)); global->Set(v8::String::New("threadInject"), v8::FunctionTemplate::New(ThreadInject)); + global->Set(v8::String::New("allocatePorts"), v8::FunctionTemplate::New(AllocatePorts)); #if !defined(_WIN32) global->Set(v8::String::New("_startMongoProgram"), v8::FunctionTemplate::New(StartMongoProgram)); global->Set(v8::String::New("stopMongod"), v8::FunctionTemplate::New(StopMongoProgram));