diff options
Diffstat (limited to 'jstests/libs/parallelTester.js')
-rw-r--r-- | jstests/libs/parallelTester.js | 354 |
1 files changed, 176 insertions, 178 deletions
diff --git a/jstests/libs/parallelTester.js b/jstests/libs/parallelTester.js index 0b230727cef..3639ab84bc1 100644 --- a/jstests/libs/parallelTester.js +++ b/jstests/libs/parallelTester.js @@ -1,225 +1,226 @@ /** - * The ParallelTester class is used to test more than one test concurrently + * The ParallelTester class is used to test more than one test concurrently */ if (typeof _threadInject != "undefined") { - Thread = function(){ - this.init.apply( this, arguments ); + Thread = function() { + this.init.apply(this, arguments); }; - _threadInject( Thread.prototype ); + _threadInject(Thread.prototype); ScopedThread = function() { - this.init.apply( this, arguments ); + this.init.apply(this, arguments); }; - ScopedThread.prototype = new Thread( function() {} ); - _scopedThreadInject( ScopedThread.prototype ); + ScopedThread.prototype = new Thread(function() {}); + _scopedThreadInject(ScopedThread.prototype); fork = function() { - var t = new Thread( function() {} ); - Thread.apply( t, arguments ); + var t = new Thread(function() {}); + Thread.apply(t, arguments); return t; - }; + }; // Helper class to generate a list of events which may be executed by a ParallelTester - EventGenerator = function( me, collectionName, mean, host ) { + EventGenerator = function(me, collectionName, mean, host) { this.mean = mean; - if (host == undefined) host = db.getMongo().host; - this.events = new Array( me, collectionName, host ); + if (host == undefined) + host = db.getMongo().host; + this.events = new Array(me, collectionName, host); }; - EventGenerator.prototype._add = function( action ) { - this.events.push( [ Random.genExp( this.mean ), action ] ); + EventGenerator.prototype._add = function(action) { + this.events.push([Random.genExp(this.mean), action]); }; - - EventGenerator.prototype.addInsert = function( obj ) { - this._add( "t.insert( " + tojson( obj ) + " )" ); + + EventGenerator.prototype.addInsert = function(obj) { + this._add("t.insert( " + tojson(obj) + " )"); }; - EventGenerator.prototype.addRemove = function( obj ) { - this._add( "t.remove( " + tojson( obj ) + " )" ); + EventGenerator.prototype.addRemove = function(obj) { + this._add("t.remove( " + tojson(obj) + " )"); }; - EventGenerator.prototype.addUpdate = function( objOld, objNew ) { - this._add( "t.update( " + tojson( objOld ) + ", " + tojson( objNew ) + " )" ); + EventGenerator.prototype.addUpdate = function(objOld, objNew) { + this._add("t.update( " + tojson(objOld) + ", " + tojson(objNew) + " )"); }; - - EventGenerator.prototype.addCheckCount = function( count, query, shouldPrint, checkQuery ) { + + EventGenerator.prototype.addCheckCount = function(count, query, shouldPrint, checkQuery) { query = query || {}; shouldPrint = shouldPrint || false; checkQuery = checkQuery || false; - var action = "assert.eq( " + count + ", t.count( " + tojson( query ) + " ) );"; - if ( checkQuery ) { - action += " assert.eq( " + count + ", t.find( " + tojson( query ) + " ).toArray().length );"; + var action = "assert.eq( " + count + ", t.count( " + tojson(query) + " ) );"; + if (checkQuery) { + action += + " assert.eq( " + count + ", t.find( " + tojson(query) + " ).toArray().length );"; } - if ( shouldPrint ) { + if (shouldPrint) { action += " print( me + ' ' + " + count + " );"; } - this._add( action ); + this._add(action); }; - + EventGenerator.prototype.getEvents = function() { return this.events; }; - + EventGenerator.dispatch = function() { var args = Array.from(arguments); var me = args.shift(); var collectionName = args.shift(); var host = args.shift(); - var m = new Mongo( host ); - var t = m.getDB( "test" )[ collectionName ]; - for( var i in args ) { - sleep( args[ i ][ 0 ] ); - eval( args[ i ][ 1 ] ); + var m = new Mongo(host); + var t = m.getDB("test")[collectionName]; + for (var i in args) { + sleep(args[i][0]); + eval(args[i][1]); } }; - + // Helper class for running tests in parallel. It assembles a set of tests // and then calls assert.parallelests to run them. ParallelTester = function() { assert.neq(db.getMongo().writeMode(), "legacy", "wrong shell write mode"); this.params = new Array(); }; - - ParallelTester.prototype.add = function( fun, args ) { + + ParallelTester.prototype.add = function(fun, args) { args = args || []; - args.unshift( fun ); - this.params.push( args ); + args.unshift(fun); + this.params.push(args); }; - - ParallelTester.prototype.run = function( msg, newScopes ) { + + ParallelTester.prototype.run = function(msg, newScopes) { newScopes = newScopes || false; - assert.parallelTests( this.params, msg, newScopes ); + assert.parallelTests(this.params, msg, newScopes); }; - + // creates lists of tests from jstests dir in a format suitable for use by // ParallelTester.fileTester. The lists will be in random order. // n: number of lists to split these tests into - ParallelTester.createJstestsLists = function( n ) { + ParallelTester.createJstestsLists = function(n) { var params = new Array(); - for( var i = 0; i < n; ++i ) { - params.push( [] ); + for (var i = 0; i < n; ++i) { + params.push([]); } - var makeKeys = function( a ) { + var makeKeys = function(a) { var ret = {}; - for( var i in a ) { - ret[ a[ i ] ] = 1; + for (var i in a) { + ret[a[i]] = 1; } return ret; }; - + // some tests can't run in parallel with most others - var skipTests = makeKeys([ "repair.js", - "cursor8.js", - "recstore.js", - "extent.js", - "indexb.js", - - // Tests that set a parameter that causes the server to ignore - // long index keys. - "index_bigkeys_nofail.js", - "index_bigkeys_validation.js", - - // tests turn on profiling - "profile1.js", - "profile3.js", - "profile4.js", - "profile5.js", - "geo_s2cursorlimitskip.js", - - "mr_drop.js", - "mr3.js", - "indexh.js", - "apitest_db.js", - "evalb.js", - "evald.js", - "evalf.js", - "killop.js", - "run_program1.js", - "notablescan.js", - "drop2.js", - "dropdb_race.js", - "fsync2.js", // May be placed in serialTestsArr once SERVER-4243 is fixed. - "bench_test1.js", - "padding.js", - "queryoptimizera.js", - "loglong.js",// log might overflow before - // this has a chance to see the message - "connections_opened.js", // counts connections, globally - "opcounters_write_cmd.js", - "currentop.js", // SERVER-8673, plus rwlock yielding issues - "set_param1.js", // changes global state - "geo_update_btree2.js", // SERVER-11132 test disables table scans - "update_setOnInsert.js", // SERVER-9982 - "max_time_ms.js", // Sensitive to query execution time, by design - "collection_info_cache_race.js", // Requires collection exists - - // This overwrites MinKey/MaxKey's singleton which breaks - // any other test that uses MinKey/MaxKey - "type6.js", - - // Assumes that other tests are not creating cursors. - "kill_cursors.js", - ] ); - + var skipTests = makeKeys([ + "repair.js", + "cursor8.js", + "recstore.js", + "extent.js", + "indexb.js", + + // Tests that set a parameter that causes the server to ignore + // long index keys. + "index_bigkeys_nofail.js", + "index_bigkeys_validation.js", + + // tests turn on profiling + "profile1.js", + "profile3.js", + "profile4.js", + "profile5.js", + "geo_s2cursorlimitskip.js", + + "mr_drop.js", + "mr3.js", + "indexh.js", + "apitest_db.js", + "evalb.js", + "evald.js", + "evalf.js", + "killop.js", + "run_program1.js", + "notablescan.js", + "drop2.js", + "dropdb_race.js", + "fsync2.js", // May be placed in serialTestsArr once SERVER-4243 is fixed. + "bench_test1.js", + "padding.js", + "queryoptimizera.js", + "loglong.js", // log might overflow before + // this has a chance to see the message + "connections_opened.js", // counts connections, globally + "opcounters_write_cmd.js", + "currentop.js", // SERVER-8673, plus rwlock yielding issues + "set_param1.js", // changes global state + "geo_update_btree2.js", // SERVER-11132 test disables table scans + "update_setOnInsert.js", // SERVER-9982 + "max_time_ms.js", // Sensitive to query execution time, by design + "collection_info_cache_race.js", // Requires collection exists + + // This overwrites MinKey/MaxKey's singleton which breaks + // any other test that uses MinKey/MaxKey + "type6.js", + + // Assumes that other tests are not creating cursors. + "kill_cursors.js", + ]); + var parallelFilesDir = "jstests/core"; - + // some tests can't be run in parallel with each other - var serialTestsArr = [ parallelFilesDir + "/fsync.js", - parallelFilesDir + "/auth1.js", - - // These tests expect the profiler to be on or off at specific points - // during the test run. - parallelFilesDir + "/cursor6.js", - parallelFilesDir + "/profile2.js", - parallelFilesDir + "/updatee.js" - ]; - var serialTests = makeKeys( serialTestsArr ); - - // prefix the first thread with the serialTests + var serialTestsArr = [ + parallelFilesDir + "/fsync.js", + parallelFilesDir + "/auth1.js", + + // These tests expect the profiler to be on or off at specific points + // during the test run. + parallelFilesDir + "/cursor6.js", + parallelFilesDir + "/profile2.js", + parallelFilesDir + "/updatee.js" + ]; + var serialTests = makeKeys(serialTestsArr); + + // prefix the first thread with the serialTests // (which we will exclude from the rest of the threads below) - params[ 0 ] = serialTestsArr; - var files = listFiles( parallelFilesDir ); - files = Array.shuffle( files ); - + params[0] = serialTestsArr; + var files = listFiles(parallelFilesDir); + files = Array.shuffle(files); + var i = 0; - files.forEach( - function(x) { - if ( ( /[\/\\]_/.test(x.name) ) || - ( ! /\.js$/.test(x.name) ) || - ( x.name.match(parallelFilesDir + "/(.*\.js)")[1] in skipTests ) || // - ( x.name in serialTests )) { - print(" >>>>>>>>>>>>>>> skipping " + x.name); - return; - } - // add the test to run in one of the threads. - params[ i % n ].push( x.name ); - ++i; - } - ); + files.forEach(function(x) { + if ((/[\/\\]_/.test(x.name)) || (!/\.js$/.test(x.name)) || + (x.name.match(parallelFilesDir + "/(.*\.js)")[1] in skipTests) || // + (x.name in serialTests)) { + print(" >>>>>>>>>>>>>>> skipping " + x.name); + return; + } + // add the test to run in one of the threads. + params[i % n].push(x.name); + ++i; + }); // randomize ordering of the serialTests - params[ 0 ] = Array.shuffle( params[ 0 ] ); + params[0] = Array.shuffle(params[0]); - for( var i in params ) { - params[ i ].unshift( i ); + for (var i in params) { + params[i].unshift(i); } return params; }; - + // runs a set of test files // first argument is an identifier for this tester, remaining arguments are file names ParallelTester.fileTester = function() { var args = Array.from(arguments); var suite = args.shift(); - args.forEach( - function( x ) { - print(" S" + suite + " Test : " + x + " ..."); - var time = Date.timeFunc( function() { load(x); }, 1); - print(" S" + suite + " Test : " + x + " " + time + "ms" ); - } - ); + args.forEach(function(x) { + print(" S" + suite + " Test : " + x + " ..."); + var time = Date.timeFunc(function() { + load(x); + }, 1); + print(" S" + suite + " Test : " + x + " " + time + "ms"); + }); }; // params: array of arrays, each element of which consists of a function followed @@ -227,52 +228,49 @@ if (typeof _threadInject != "undefined") { // be called in a separate thread. // msg: failure message // newScopes: if true, each thread starts in a fresh scope - assert.parallelTests = function( params, msg, newScopes ) { + assert.parallelTests = function(params, msg, newScopes) { newScopes = newScopes || false; - var wrapper = function( fun, argv ) { - eval ( - "var z = function() {" + - "TestData = " + tojson(TestData) + ";" + - "var __parallelTests__fun = " + fun.toString() + ";" + - "var __parallelTests__argv = " + tojson( argv ) + ";" + - "var __parallelTests__passed = false;" + - "try {" + - "__parallelTests__fun.apply( 0, __parallelTests__argv );" + - "__parallelTests__passed = true;" + - "} catch ( e ) {" + - "print('');" + - "print( '********** Parallel Test FAILED: ' + tojson(e) );" + - "print('');" + - "}" + - "return __parallelTests__passed;" + - "}" - ); + var wrapper = function(fun, argv) { + eval("var z = function() {" + "TestData = " + tojson(TestData) + ";" + + "var __parallelTests__fun = " + fun.toString() + ";" + + "var __parallelTests__argv = " + tojson(argv) + ";" + + "var __parallelTests__passed = false;" + "try {" + + "__parallelTests__fun.apply( 0, __parallelTests__argv );" + + "__parallelTests__passed = true;" + "} catch ( e ) {" + "print('');" + + "print( '********** Parallel Test FAILED: ' + tojson(e) );" + "print('');" + "}" + + "return __parallelTests__passed;" + "}"); return z; }; var runners = new Array(); - for( var i in params ) { - var param = params[ i ]; + for (var i in params) { + var param = params[i]; var test = param.shift(); var t; - if ( newScopes ) - t = new ScopedThread( wrapper( test, param ) ); + if (newScopes) + t = new ScopedThread(wrapper(test, param)); else - t = new Thread( wrapper( test, param ) ); - runners.push( t ); + t = new Thread(wrapper(test, param)); + runners.push(t); } - - runners.forEach( function( x ) { x.start(); } ); + + runners.forEach(function(x) { + x.start(); + }); var nFailed = 0; // SpiderMonkey doesn't like it if we exit before all threads are joined // (see SERVER-19615 for a similar issue). - runners.forEach( function( x ) { if( !x.returnData() ) { ++nFailed; } } ); - assert.eq( 0, nFailed, msg ); + runners.forEach(function(x) { + if (!x.returnData()) { + ++nFailed; + } + }); + assert.eq(0, nFailed, msg); }; } -if ( typeof CountDownLatch !== 'undefined' ) { +if (typeof CountDownLatch !== 'undefined') { CountDownLatch = Object.extend(function(count) { - if (! (this instanceof CountDownLatch)) { + if (!(this instanceof CountDownLatch)) { return new CountDownLatch(count); } this._descriptor = CountDownLatch._new.apply(null, arguments); |