summaryrefslogtreecommitdiff
path: root/jstests/parallel
diff options
context:
space:
mode:
authoralabid <alabidan@gmail.com>2014-12-29 00:01:02 -0500
committerBenety Goh <benety@mongodb.com>2014-12-31 10:11:12 -0500
commitc8c43855e1d3158385a68df12919d2ea97f45ecd (patch)
treef4850c832ee2f3e0fcb42f92bca1922aa09e48f5 /jstests/parallel
parent2c3dea56d483ed0dca1413a69ef429f1429a7cad (diff)
downloadmongo-c8c43855e1d3158385a68df12919d2ea97f45ecd.tar.gz
SERVER-16695 Move FSM tests into new test suites
Closes #893 Signed-off-by: Benety Goh <benety@mongodb.com>
Diffstat (limited to 'jstests/parallel')
-rw-r--r--jstests/parallel/fsm_all.js11
-rw-r--r--jstests/parallel/fsm_all_composed.js13
-rw-r--r--jstests/parallel/fsm_all_master_slave.js12
-rw-r--r--jstests/parallel/fsm_all_replication.js12
-rw-r--r--jstests/parallel/fsm_all_sharded.js12
-rw-r--r--jstests/parallel/fsm_all_sharded_replication.js12
-rw-r--r--jstests/parallel/fsm_all_simultaneous.js12
-rw-r--r--jstests/parallel/fsm_example.js72
-rw-r--r--jstests/parallel/fsm_example_inheritance.js18
-rw-r--r--jstests/parallel/fsm_libs/assert.js107
-rw-r--r--jstests/parallel/fsm_libs/composer.js77
-rw-r--r--jstests/parallel/fsm_libs/fsm.js59
-rw-r--r--jstests/parallel/fsm_libs/runner.js586
-rw-r--r--jstests/parallel/fsm_libs/utils.js19
-rw-r--r--jstests/parallel/fsm_libs/worker_thread.js74
-rw-r--r--jstests/parallel/fsm_selftests.js39
-rw-r--r--jstests/parallel/fsm_workload_helpers/indexed_noindex.js17
-rw-r--r--jstests/parallel/fsm_workloads/findAndModify_inc.js59
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_1char.js20
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_1char_noindex.js10
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_base.js65
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_base_noindex.js10
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_heterogeneous.js49
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_heterogeneous_noindex.js10
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_large.js36
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_large_noindex.js10
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_long_fieldname.js16
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_long_fieldname_noindex.js10
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_multikey.js22
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_multikey_noindex.js10
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_ordered_bulk.js30
-rw-r--r--jstests/parallel/fsm_workloads/indexed_insert_unordered_bulk.js30
-rw-r--r--jstests/parallel/fsm_workloads/update_inc.js67
-rw-r--r--jstests/parallel/fsm_workloads/update_ordered_bulk_inc.js69
34 files changed, 0 insertions, 1675 deletions
diff --git a/jstests/parallel/fsm_all.js b/jstests/parallel/fsm_all.js
deleted file mode 100644
index e180556e1fa..00000000000
--- a/jstests/parallel/fsm_all.js
+++ /dev/null
@@ -1,11 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js');
-
-var dir = 'jstests/parallel/fsm_workloads';
-
-var blacklist = [
- 'indexed_insert_multikey.js' // SERVER-16143
-].map(function(file) { return dir + '/' + file; });
-
-runWorkloadsSerially(ls(dir).filter(function(file) {
- return !Array.contains(blacklist, file);
-}));
diff --git a/jstests/parallel/fsm_all_composed.js b/jstests/parallel/fsm_all_composed.js
deleted file mode 100644
index 594ecdbac81..00000000000
--- a/jstests/parallel/fsm_all_composed.js
+++ /dev/null
@@ -1,13 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js');
-
-var dir = 'jstests/parallel/fsm_workloads';
-
-var blacklist = [
- 'indexed_insert_multikey.js', // SERVER-16143
- 'indexed_insert_multikey_noindex.js' // SERVER-16143
-].map(function(file) { return dir + '/' + file; });
-
-// SERVER-16196 re-enable executing workloads
-// runMixtureOfWorkloads(ls(dir).filter(function(file) {
-// return !Array.contains(blacklist, file);
-// }));
diff --git a/jstests/parallel/fsm_all_master_slave.js b/jstests/parallel/fsm_all_master_slave.js
deleted file mode 100644
index c2de2d3a13d..00000000000
--- a/jstests/parallel/fsm_all_master_slave.js
+++ /dev/null
@@ -1,12 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js');
-
-var dir = 'jstests/parallel/fsm_workloads';
-
-var blacklist = [
- 'indexed_insert_multikey.js' // SERVER-16143
-].map(function(file) { return dir + '/' + file; });
-
-// SERVER-16196 re-enable executing workloads with master-slave replication
-// runWorkloadsSerially(ls(dir).filter(function(file) {
-// return !Array.contains(blacklist, file);
-// }), { masterSlave: true });
diff --git a/jstests/parallel/fsm_all_replication.js b/jstests/parallel/fsm_all_replication.js
deleted file mode 100644
index f00d28589b9..00000000000
--- a/jstests/parallel/fsm_all_replication.js
+++ /dev/null
@@ -1,12 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js');
-
-var dir = 'jstests/parallel/fsm_workloads';
-
-var blacklist = [
- 'indexed_insert_multikey.js' // SERVER-16143
-].map(function(file) { return dir + '/' + file; });
-
-// SERVER-16196 re-enable executing workloads against replica sets
-// runWorkloadsSerially(ls(dir).filter(function(file) {
-// return !Array.contains(blacklist, file);
-// }), { replication: true });
diff --git a/jstests/parallel/fsm_all_sharded.js b/jstests/parallel/fsm_all_sharded.js
deleted file mode 100644
index 7cb1a47ddaf..00000000000
--- a/jstests/parallel/fsm_all_sharded.js
+++ /dev/null
@@ -1,12 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js');
-
-var dir = 'jstests/parallel/fsm_workloads';
-
-var blacklist = [
- 'indexed_insert_multikey.js' // SERVER-16143
-].map(function(file) { return dir + '/' + file; });
-
-// SERVER-16196 re-enable executing workloads against sharded clusters
-// runWorkloadsSerially(ls(dir).filter(function(file) {
-// return !Array.contains(blacklist, file);
-// }), { sharded: true });
diff --git a/jstests/parallel/fsm_all_sharded_replication.js b/jstests/parallel/fsm_all_sharded_replication.js
deleted file mode 100644
index b482252310b..00000000000
--- a/jstests/parallel/fsm_all_sharded_replication.js
+++ /dev/null
@@ -1,12 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js');
-
-var dir = 'jstests/parallel/fsm_workloads';
-
-var blacklist = [
- 'indexed_insert_multikey.js' // SERVER-16143
-].map(function(file) { return dir + '/' + file; });
-
-// SERVER-16196 re-enable executing workloads against sharded replica sets
-// runWorkloadsSerially(ls(dir).filter(function(file) {
-// return !Array.contains(blacklist, file);
-// }), { sharded: true, replication: true });
diff --git a/jstests/parallel/fsm_all_simultaneous.js b/jstests/parallel/fsm_all_simultaneous.js
deleted file mode 100644
index 8cd32a0ef90..00000000000
--- a/jstests/parallel/fsm_all_simultaneous.js
+++ /dev/null
@@ -1,12 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js');
-
-var dir = 'jstests/parallel/fsm_workloads';
-
-var blacklist = [
- 'indexed_insert_multikey.js' // SERVER-16143
-].map(function(file) { return dir + '/' + file; });
-
-// SERVER-16196 re-enable executing workloads
-// runWorkloadsInParallel(ls(dir).filter(function(file) {
-// return !Array.contains(blacklist, file);
-// }));
diff --git a/jstests/parallel/fsm_example.js b/jstests/parallel/fsm_example.js
deleted file mode 100644
index 6bb549258c3..00000000000
--- a/jstests/parallel/fsm_example.js
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * fsm_example.js
- *
- * Includes documentation of each property on $config.
- * Serves as a template for new workloads.
- */
-var $config = (function() {
-
- // 'data' is passed (copied) to each of the worker threads.
- var data = {};
-
- // 'states' are the different functions callable by a worker
- // thread. The 'this' argument of any exposed function is
- // bound as '$config.data'.
- var states = {
- init: function init(db, collName) {
- this.start = 10 * this.tid;
- },
-
- scanGT: function scanGT(db, collName) {
- db[collName].find({ _id: { $gt: this.start } }).itcount();
- },
-
- scanLTE: function scanLTE(db, collName) {
- db[collName].find({ _id: { $lte: this.start } }).itcount();
- },
- };
-
- // 'transitions' defines how the FSM should proceed from its
- // current state to the next state. The value associated with a
- // particular state represents the likelihood of that transition.
- //
- // For example, 'init: { scanGT: 0.5, scanLTE: 0.5 }' means that
- // the worker thread will transition from the 'init' state
- // to the 'scanGT' state with probability 0.5, and
- // to the 'scanLTE' state with probability 0.5.
- //
- // All state functions should appear as keys within 'transitions'.
- var transitions = {
- init: { scanGT: 0.5, scanLTE: 0.5 },
- scanGT: { scanGT: 0.8, scanLTE: 0.2 },
- scanLTE: { scanGT: 0.2, scanLTE: 0.8 }
- };
-
- // 'setup' is run once by the parent thread after the cluster has
- // been initialized, but before the worker threads have been spawned.
- // The 'this' argument is bound as '$config.data'.
- function setup(db, collName) {
- // Workloads should NOT drop the collection db[collName], as
- // doing so is handled by runner.js before 'setup' is called.
- for (var i = 0; i < 1000; ++i) {
- db[collName].insert({ _id: i });
- }
- }
-
- // 'teardown' is run once by the parent thread before the cluster
- // is destroyed, but after the worker threads have been reaped.
- // The 'this' argument is bound as '$config.data'.
- function teardown(db, collName) {}
-
- return {
- threadCount: 5,
- iterations: 10,
- startState: 'init', // optional, default 'init'
- states: states,
- transitions: transitions,
- setup: setup, // optional, default empty function
- teardown: teardown, // optional, default empty function
- data: data // optional, default empty object
- };
-
-})();
diff --git a/jstests/parallel/fsm_example_inheritance.js b/jstests/parallel/fsm_example_inheritance.js
deleted file mode 100644
index e8e5452da3a..00000000000
--- a/jstests/parallel/fsm_example_inheritance.js
+++ /dev/null
@@ -1,18 +0,0 @@
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_example.js'); // for $config
-
-// extendWorkload takes a $config object and a callback, and returns an extended $config object.
-var $config = extendWorkload($config, function($config, $super) {
- // In the callback, $super is the base workload definition we're extending,
- // and $config is the extended workload definition we're creating.
-
- // You can replace any properties on $config, including methods you want to override.
- $config.setup = function(db, collName) {
- // Overridden methods should usually call the corresponding method on $super.
- $super.setup.apply(this, arguments);
-
- db[collName].ensureIndex({ exampleIndexedField: 1 });
- };
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_libs/assert.js b/jstests/parallel/fsm_libs/assert.js
deleted file mode 100644
index e0409c132b5..00000000000
--- a/jstests/parallel/fsm_libs/assert.js
+++ /dev/null
@@ -1,107 +0,0 @@
-
-/**
- * Helpers for controlling under which situations an assert is actually executed.
- * This allows us to define workloads that will have only valid assertions,
- * regardless of how any particular workload gets run with any others.
- *
- * There are 3 different assert levels:
- * ALWAYS = these assertions are always executed
- * OWN_COLL = these assertions are executed when workloads are run on separate collections
- * OWN_DB = these assertions are executed when workloads are run on separate databases
- */
-
-var AssertLevel = (function() {
-
- function AssertLevel(level) {
- this.level = level;
-
- // Returns < 0 if this < other
- // = 0 if this == other
- // > 0 if this > other
- this.compareTo = function(other) {
- return this.level - other.level;
- };
- }
-
- function isAssertLevel(obj) {
- return obj instanceof AssertLevel;
- }
-
- return {
- ALWAYS: new AssertLevel(0),
- OWN_COLL: new AssertLevel(1),
- OWN_DB: new AssertLevel(2),
- isAssertLevel: isAssertLevel
- };
-
-})();
-
-if (typeof globalAssertLevel === 'undefined') {
- var globalAssertLevel = AssertLevel.ALWAYS;
-}
-
-var assertWithLevel = function(level) {
- assert(AssertLevel.isAssertLevel(level), 'expected AssertLevel as first argument');
-
- function quietlyDoAssert(msg) {
- // eval if msg is a function
- if (typeof msg === 'function') {
- msg = msg();
- }
-
- throw new Error(msg);
- }
-
- function wrapAssertFn(fn, args) {
- var doassertSaved = doassert;
- try {
- doassert = quietlyDoAssert;
- fn.apply(assert, args); // functions typically get called on 'assert'
- } finally {
- doassert = doassertSaved;
- }
- }
-
- var assertWithLevel = function() {
- // Only execute assertion if level for which it was defined is
- // a subset of the global assertion level
- if (level.compareTo(globalAssertLevel) > 0) {
- return;
- }
-
- if (arguments.length === 1 && typeof arguments[0] === 'function') {
- // Assert against the value returned by the function
- arguments[0] = arguments[0]();
-
- // If a function does not explictly return a value,
- // then have it implicitly return true
- if (typeof arguments[0] === 'undefined') {
- arguments[0] = true;
- }
- }
-
- wrapAssertFn(assert, arguments);
- };
-
- Object.keys(assert).forEach(function(fn) {
- if (typeof assert[fn] !== 'function') {
- return;
- }
-
- assertWithLevel[fn] = function() {
- // Only execute assertion if level for which it was defined is
- // a subset of the global assertion level
- if (level.compareTo(globalAssertLevel) > 0) {
- return;
- }
-
- wrapAssertFn(assert[fn], arguments);
- };
- });
-
- return assertWithLevel;
-};
-
-var assertAlways = assertWithLevel(AssertLevel.ALWAYS);
-var assertWhenOwnColl = assertWithLevel(AssertLevel.OWN_COLL);
-var assertWhenOwnDB = assertWithLevel(AssertLevel.OWN_DB);
diff --git a/jstests/parallel/fsm_libs/composer.js b/jstests/parallel/fsm_libs/composer.js
deleted file mode 100644
index c7e2e226e73..00000000000
--- a/jstests/parallel/fsm_libs/composer.js
+++ /dev/null
@@ -1,77 +0,0 @@
-load('jstests/parallel/fsm_libs/fsm.js');
-
-var composer = (function() {
-
- function runCombinedFSM(workloads, configs, mixProb) {
- // TODO: what if a workload depends on iterations?
- var iterations = 100;
-
- assert.eq(AssertLevel.ALWAYS, globalAssertLevel,
- 'global assertion level is not set as ALWAYS');
-
- var currentWorkload = getRandomElem(workloads, Random.rand());
- var currentState = configs[currentWorkload].startState;
-
- var myDB, collName;
- var first = true;
- workloads.forEach(function(workload) {
- var args = configs[workload];
- if (!first) {
- assert.eq(myDB, args.db, 'expected all workloads to use same database');
- assert.eq(collName, args.collName,
- 'expected all workloads to use same collection');
- }
- myDB = args.db;
- collName = args.collName;
- first = false;
-
- if (workload !== currentWorkload) {
- args.states[args.startState].call(args.data, myDB, collName);
- }
- });
-
- // Runs an interleaving of the specified workloads
- for (var i = 0; i < iterations; ++i) {
- var args = configs[currentWorkload];
- args.states[currentState].call(args.data, myDB, collName);
-
- // Transition to another valid state of the current workload,
- // with probability '1 - mixProb'
- if (Random.rand() >= mixProb) {
- var nextState = fsm._getWeightedRandomChoice(args.transitions[currentState],
- Random.rand());
- currentState = nextState;
- continue;
- }
-
- // Transition to a state of another workloads with probability 'mixProb'
- var otherStates = [];
- workloads.forEach(function(workload) {
- if (workload === currentWorkload) {
- return;
- }
-
- var args = configs[workload];
- Object.keys(args.states).forEach(function(state) {
- if (state !== args.startState) {
- otherStates.push({ workload: workload, state: state });
- }
- });
- });
-
- var next = getRandomElem(otherStates, Random.rand());
- currentWorkload = next.workload;
- currentState = next.state;
- }
- }
-
- function getRandomElem(items, randVal) {
- assert.gt(items.length, 0);
- return items[Math.floor(randVal * items.length)];
- }
-
- return {
- run: runCombinedFSM
- };
-
-})();
diff --git a/jstests/parallel/fsm_libs/fsm.js b/jstests/parallel/fsm_libs/fsm.js
deleted file mode 100644
index e8ce2e27317..00000000000
--- a/jstests/parallel/fsm_libs/fsm.js
+++ /dev/null
@@ -1,59 +0,0 @@
-var fsm = (function() {
- // args.data = 'this' object of the state functions
- // args.db = database object
- // args.collName = collection name
- // args.startState = name of initial state function
- // args.states = state functions of the form
- // { stateName: function(db, collName) { ... } }
- // args.transitions = transitions between state functions of the form
- // { stateName: { nextState1: probability,
- // nextState2: ... } }
- // args.iterations = number of iterations to run the FSM for
- function runFSM(args) {
- var currentState = args.startState;
- for (var i = 0; i < args.iterations; ++i) {
- args.states[currentState].call(args.data, args.db, args.collName);
- var nextState = getWeightedRandomChoice(args.transitions[currentState], Random.rand());
- currentState = nextState;
- }
- }
-
- // doc = document of the form
- // { nextState1: probability, nextState2: ... }
- // randVal = a value on the interval [0, 1)
- // returns a state, weighted by its probability,
- // assuming randVal was chosen randomly by the caller
- function getWeightedRandomChoice(doc, randVal) {
- assert.gte(randVal, 0);
- assert.lt(randVal, 1);
-
- var states = Object.keys(doc);
- assert.gt(states.length, 0, "transition must have at least one state to transition to");
-
- // weights = [ 0.25, 0.5, 0.25 ]
- // => accumulated = [ 0.25, 0.75, 1 ]
- var weights = states.map(function(k) { return doc[k]; });
-
- var accumulated = [];
- var sum = weights.reduce(function(a, b, i) {
- accumulated[i] = a + b;
- return accumulated[i];
- }, 0);
-
- // Scale the random value by the sum of the weights
- randVal *= sum; // ~ U[0, sum)
-
- // Find the state corresponding to randVal
- for (var i = 0; i < accumulated.length; ++i) {
- if (randVal < accumulated[i]) {
- return states[i];
- }
- }
- assert(false, 'not reached');
- }
-
- return {
- run: runFSM,
- _getWeightedRandomChoice: getWeightedRandomChoice
- };
-})();
diff --git a/jstests/parallel/fsm_libs/runner.js b/jstests/parallel/fsm_libs/runner.js
deleted file mode 100644
index e847feef69a..00000000000
--- a/jstests/parallel/fsm_libs/runner.js
+++ /dev/null
@@ -1,586 +0,0 @@
-load('jstests/libs/parallelTester.js');
-load('jstests/parallel/fsm_libs/assert.js');
-load('jstests/parallel/fsm_libs/utils.js');
-load('jstests/parallel/fsm_libs/worker_thread.js');
-
-
-/** extendWorkload usage:
- *
- * $config = extendWorkload($config, function($config, $super) {
- * // ... modify $config ...
- * $config.foo = function() { // override a method
- * $super.foo.call(this, arguments); // call super
- * };
- * return $config;
- * });
- */
-function extendWorkload($config, callback) {
- assert.eq(2, arguments.length,
- "extendWorkload must be called with 2 arguments: $config and callback");
- assert.eq('function', typeof callback,
- "2nd argument to extendWorkload must be a callback");
- assert.eq(2, callback.length,
- "2nd argument to extendWorkload must take 2 arguments: $config and $super");
- var parsedSuperConfig = parseConfig($config);
- var childConfig = Object.extend({}, parsedSuperConfig, true);
- return callback(childConfig, parsedSuperConfig);
-}
-
-function runWorkloadsSerially(workloads, clusterOptions) {
- if (typeof workloads === 'string') {
- workloads = [workloads];
- }
- assert.gt(workloads.length, 0);
- workloads.forEach(function(workload) {
- // 'workload' is a JS file expected to set the global $config variable to an object.
- load(workload);
- assert.neq(typeof $config, 'undefined');
-
- _runWorkload(workload, $config, clusterOptions);
- });
-}
-
-function runWorkloadsInParallel(workloads, clusterOptions) {
- assert.gt(workloads.length, 0);
-
- var context = {};
- workloads.forEach(function(workload) {
- // 'workload' is a JS file expected to set the global $config variable to an object.
- load(workload);
- assert.neq(typeof $config, 'undefined');
- context[workload] = { config: $config };
- });
-
- _runAllWorkloads(workloads, context, clusterOptions);
-}
-
-function runMixtureOfWorkloads(workloads, clusterOptions) {
- assert.gt(workloads.length, 0);
-
- var context = {};
- workloads.forEach(function(workload) {
- // 'workload' is a JS file expected to set the global $config variable to an object.
- load(workload);
- assert.neq(typeof $config, 'undefined');
- context[workload] = { config: $config };
- });
-
- clusterOptions = Object.extend({}, clusterOptions, true); // defensive deep copy
- clusterOptions.sameDB = true;
- clusterOptions.sameCollection = true;
-
- var cluster = setupCluster(clusterOptions, 'fakedb');
- globalAssertLevel = AssertLevel.ALWAYS;
-
- var cleanup = [];
- var errors = [];
-
- try {
- prepareCollections(workloads, context, cluster, clusterOptions);
- cleanup = setUpWorkloads(workloads, context);
-
- var threads = makeAllThreads(workloads, context, clusterOptions, true);
-
- joinThreads(threads).forEach(function(err) {
- errors.push(err);
- });
-
- } finally {
- // TODO: does order of calling 'config.teardown' matter?
- cleanup.forEach(function(teardown) {
- try {
- teardown.fn.call(teardown.data, teardown.db, teardown.collName);
- } catch (err) {
- print('Teardown function threw an exception:\n' + err.stack);
- }
- });
-
- cluster.teardown();
- }
-
- throwError(errors);
-}
-
-// Validate the config object and return a normalized copy of it.
-// Normalized means all optional parameters are set to their default values,
-// and any parameters that need to be coerced have been coerced.
-function parseConfig(config) {
- // make a deep copy so we can mutate config without surprising the caller
- config = Object.extend({}, config, true);
- var allowedKeys = [
- 'data',
- 'iterations',
- 'setup',
- 'startState',
- 'states',
- 'teardown',
- 'threadCount',
- 'transitions'
- ];
- Object.keys(config).forEach(function(k) {
- assert.gte(allowedKeys.indexOf(k), 0,
- "invalid config parameter: " + k + ". valid parameters are: " +
- tojson(allowedKeys));
- });
-
- assert.eq('number', typeof config.threadCount);
-
- assert.eq('number', typeof config.iterations);
-
- config.startState = config.startState || 'init';
- assert.eq('string', typeof config.startState);
-
- assert.eq('object', typeof config.states);
- assert.gt(Object.keys(config.states).length, 0);
- Object.keys(config.states).forEach(function(k) {
- assert.eq('function', typeof config.states[k],
- "config.states." + k + " is not a function");
- assert.eq(2, config.states[k].length,
- "state functions should accept 2 parameters: db and collName");
- });
-
- // assert all states mentioned in config.transitions are present in config.states
- assert.eq('object', typeof config.transitions);
- assert.gt(Object.keys(config.transitions).length, 0);
- Object.keys(config.transitions).forEach(function(fromState) {
- assert(config.states.hasOwnProperty(fromState),
- "config.transitions contains a state not in config.states: " + fromState);
-
- assert.gt(Object.keys(config.transitions[fromState]).length, 0);
- Object.keys(config.transitions[fromState]).forEach(function(toState) {
- assert(config.states.hasOwnProperty(toState),
- "config.transitions." + fromState +
- " contains a state not in config.states: " + toState);
- assert.eq('number', typeof config.transitions[fromState][toState],
- "transitions." + fromState + "." + toState + " should be a number");
- });
- });
-
- config.setup = config.setup || function(){};
- assert.eq('function', typeof config.setup);
-
- config.teardown = config.teardown || function(){};
- assert.eq('function', typeof config.teardown);
-
- config.data = config.data || {};
- assert.eq('object', typeof config.data);
-
- return config;
-}
-
-function setupCluster(clusterOptions, dbName) {
- var cluster = {};
-
- var allowedKeys = [
- 'masterSlave',
- 'replication',
- 'sameCollection',
- 'sameDB',
- 'seed',
- 'sharded'
- ];
- Object.keys(clusterOptions).forEach(function(opt) {
- assert(0 <= allowedKeys.indexOf(opt),
- "invalid option: " + tojson(opt) + ". valid options are: " + tojson(allowedKeys));
- });
-
- var verbosityLevel = 1;
- if (clusterOptions.sharded) {
- // TODO: allow 'clusterOptions' to specify the number of shards
- var shardConfig = {
- shards: 2,
- mongos: 1,
- verbose: verbosityLevel
- };
-
- // TODO: allow 'clusterOptions' to specify an 'rs' config
- if (clusterOptions.replication) {
- shardConfig.rs = {
- nodes: 3,
- verbose: verbosityLevel
- };
- }
-
- var st = new ShardingTest(shardConfig);
- st.stopBalancer();
- var mongos = st.s;
-
- clusterOptions.addr = mongos.host;
- cluster.db = mongos.getDB(dbName);
- cluster.shardCollection = function() {
- st.shardColl.apply(st, arguments);
- };
- cluster.teardown = function() {
- st.stop();
- };
- } else if (clusterOptions.replication) {
- // TODO: allow 'clusterOptions' to specify the number of nodes
- var replSetConfig = {
- nodes: 3,
- nodeOptions: { verbose: verbosityLevel }
- };
-
- var rst = new ReplSetTest(replSetConfig);
- rst.startSet();
-
- // Send the replSetInitiate command and wait for initiation
- rst.initiate();
- rst.awaitSecondaryNodes();
-
- var primary = rst.getPrimary();
-
- clusterOptions.addr = primary.host;
- cluster.db = primary.getDB(dbName);
- cluster.teardown = function() {
- rst.stopSet();
- };
- } else if (clusterOptions.masterSlave) {
- var rt = new ReplTest('replTest');
-
- var master = rt.start(true);
- var slave = rt.start(false);
-
- master.adminCommand({ setParameter: 1, logLevel: verbosityLevel });
- slave.adminCommand({ setParameter: 1, logLevel: verbosityLevel });
-
- clusterOptions.addr = master.host;
- cluster.db = master.getDB(dbName);
- cluster.teardown = function() {
- rt.stop();
- };
- } else { // standalone server
- cluster.db = db.getSiblingDB(dbName);
- cluster.db.adminCommand({ setParameter: 1, logLevel: verbosityLevel });
- cluster.teardown = function() {};
- }
-
- return cluster;
-}
-
-function _runWorkload(workload, config, clusterOptions) {
- var context = {};
- context[workload] = { config: config };
- _runAllWorkloads([workload], context, clusterOptions);
-}
-
-// TODO: give this function a more descriptive name?
-// Calls the 'config.setup' function for each workload, and returns
-// an array of 'config.teardown' functions to execute with the appropriate
-// arguments. Note that the implementation relies on having 'db' and 'collName'
-// set as properties on context[workload].
-function setUpWorkloads(workloads, context) {
- return workloads.map(function(workload) {
- var myDB = context[workload].db;
- var collName = context[workload].collName;
-
- var config = context[workload].config;
- config = parseConfig(config);
- config.setup.call(config.data, myDB, collName);
-
- return {
- fn: config.teardown,
- data: config.data,
- db: myDB,
- collName: collName
- };
- });
-}
-
-function prepareCollections(workloads, context, cluster, clusterOptions) {
- var dbName, collName, myDB;
- var firstWorkload = true;
-
- // Clean up the state left behind by other tests in the parallel suite
- // to avoid having too many open files
- db.dropDatabase();
-
- workloads.forEach(function(workload) {
- if (firstWorkload || !clusterOptions.sameCollection) {
- if (firstWorkload || !clusterOptions.sameDB) {
- dbName = uniqueDBName();
- }
- collName = uniqueCollName();
-
- myDB = cluster.db.getSiblingDB(dbName);
- myDB[collName].drop();
-
- if (clusterOptions.sharded) {
- // TODO: allow 'clusterOptions' to specify the shard key and split
- cluster.shardCollection(myDB[collName], { _id: 'hashed' }, false);
- }
- }
-
- context[workload].db = myDB;
- context[workload].dbName = dbName;
- context[workload].collName = collName;
-
- firstWorkload = false;
- });
-}
-
-/* This is the function that most other run*Workload* functions delegate to.
- * It takes an array of workload filenames and runs them all in parallel.
- *
- * TODO: document the other two parameters
- */
-function _runAllWorkloads(workloads, context, clusterOptions) {
- clusterOptions = Object.extend({}, clusterOptions, true); // defensive deep copy
- var cluster = setupCluster(clusterOptions, 'fakedb');
-
- // Determine how strong to make assertions while simultaneously executing different workloads
- var assertLevel = AssertLevel.OWN_DB;
- if (clusterOptions.sameDB) {
- // The database is shared by multiple workloads, so only make the asserts
- // that apply when the collection is owned by an individual workload
- assertLevel = AssertLevel.OWN_COLL;
- }
- if (clusterOptions.sameCollection) {
- // The collection is shared by multiple workloads, so only make the asserts
- // that always apply
- assertLevel = AssertLevel.ALWAYS;
- }
- globalAssertLevel = assertLevel;
-
- var cleanup = [];
- var errors = [];
-
- try {
- prepareCollections(workloads, context, cluster, clusterOptions);
- cleanup = setUpWorkloads(workloads, context);
-
- var threads = makeAllThreads(workloads, context, clusterOptions, false);
-
- joinThreads(threads).forEach(function(err) {
- errors.push(err);
- });
- } finally {
- // TODO: does order of calling 'config.teardown' matter?
- cleanup.forEach(function(teardown) {
- try {
- teardown.fn.call(teardown.data, teardown.db, teardown.collName);
- } catch (err) {
- print('Teardown function threw an exception:\n' + err.stack);
- }
- });
-
- cluster.teardown();
- }
-
- throwError(errors);
-}
-
-function makeAllThreads(workloads, context, clusterOptions, compose) {
- var threadFn, getWorkloads;
- if (compose) {
- // Worker threads need to load() all workloads when composed
- threadFn = workerThread.composed;
- getWorkloads = function() { return workloads; };
- } else {
- // Worker threads only need to load() the specified workload
- threadFn = workerThread.fsm;
- getWorkloads = function(workload) { return [workload]; };
- }
-
- function sumRequestedThreads() {
- return Array.sum(workloads.map(function(wl) {
- return context[wl].config.threadCount;
- }));
- }
-
- // TODO: pick a better cap for maximum allowed threads?
- var maxAllowedThreads = 100;
- var requestedNumThreads = sumRequestedThreads();
- if (requestedNumThreads > maxAllowedThreads) {
- print('\n\ntoo many threads requested: ' + requestedNumThreads);
- // Scale down the requested '$config.threadCount' values to make
- // them sum to less than 'maxAllowedThreads'
- var factor = maxAllowedThreads / requestedNumThreads;
- workloads.forEach(function(workload) {
- var threadCount = context[workload].config.threadCount;
- threadCount = Math.floor(factor * threadCount);
- threadCount = Math.max(1, threadCount); // ensure workload is executed
- context[workload].config.threadCount = threadCount;
- });
- }
- var numThreads = sumRequestedThreads();
- print('using num threads: ' + numThreads);
- assert.lte(numThreads, maxAllowedThreads);
-
- var latch = new CountDownLatch(numThreads);
-
- var threads = [];
-
- jsTest.log(workloads.join('\n'));
- Random.setRandomSeed(clusterOptions.seed);
-
- var tid = 0;
- workloads.forEach(function(workload) {
- var workloadsToLoad = getWorkloads(workload);
- var config = context[workload].config;
-
- for (var i = 0; i < config.threadCount; ++i) {
- var args = {
- tid: tid++,
- latch: latch,
- dbName: context[workload].dbName,
- collName: context[workload].collName,
- clusterOptions: clusterOptions,
- seed: Random.randInt(1e13), // contains range of Date.getTime()
- globalAssertLevel: globalAssertLevel
- };
-
- // Wrap threadFn with try/finally to make sure it always closes the db connection
- // that is implicitly created within the thread's scope.
- var guardedThreadFn = function(threadFn, args) {
- try {
- return threadFn.apply(this, args);
- } finally {
- db = null;
- gc();
- }
- };
-
- var t = new ScopedThread(guardedThreadFn, threadFn, [workloadsToLoad, args]);
- threads.push(t);
- t.start();
-
- // Wait a little before starting the next thread
- // to avoid creating new connections at the same time
- sleep(10);
- }
- });
-
- var failedThreadIndexes = [];
- while (latch.getCount() > 0) {
- threads.forEach(function(t, i) {
- if (t.hasFailed() && !Array.contains(failedThreadIndexes, i)) {
- failedThreadIndexes.push(i);
- latch.countDown();
- }
- });
-
- sleep(100);
- }
-
- var failedThreads = failedThreadIndexes.length;
- if (failedThreads > 0) {
- print(failedThreads + ' thread(s) threw a JS or C++ exception while spawning');
- }
-
- var allowedFailure = 0.2;
- if (failedThreads / numThreads > allowedFailure) {
- throw new Error('Too many worker threads failed to spawn - aborting');
- }
-
- return threads;
-}
-
-function joinThreads(workerThreads) {
- var workerErrs = [];
-
- workerThreads.forEach(function(t) {
- t.join();
-
- var data = t.returnData();
- if (data && !data.ok) {
- workerErrs.push(data);
- }
- });
-
- return workerErrs;
-}
-
-function throwError(workerErrs) {
-
- // Returns an array containing all unique values from the specified array
- // and their corresponding number of occurrences in the original array.
- function freqCount(arr) {
- var unique = [];
- var freqs = [];
-
- arr.forEach(function(item) {
- var i = unique.indexOf(item);
- if (i < 0) {
- unique.push(item);
- freqs.push(1);
- } else {
- freqs[i]++;
- }
- });
-
- return unique.map(function(value, i) {
- return { value: value, freq: freqs[i] };
- });
- }
-
- // Indents a multiline string with the specified number of spaces.
- function indent(str, size) {
- var prefix = new Array(size + 1).join(' ');
- return prefix + str.split('\n').join('\n' + prefix);
- }
-
- function pluralize(str, num) {
- var suffix = num > 1 ? 's' : '';
- return num + ' ' + str + suffix;
- }
-
- function prepareMsg(stackTraces) {
- var uniqueTraces = freqCount(stackTraces);
- var numUniqueTraces = uniqueTraces.length;
-
- // Special case message when threads all have the same trace
- if (numUniqueTraces === 1) {
- return pluralize('thread', stackTraces.length) + ' threw\n\n' +
- indent(uniqueTraces[0].value, 8);
- }
-
- var summary = pluralize('thread', stackTraces.length) + ' threw ' +
- numUniqueTraces + ' different exceptions:\n\n';
-
- return summary + uniqueTraces.map(function(obj) {
- var line = pluralize('thread', obj.freq) + ' threw\n';
- return indent(line + obj.value, 8);
- }).join('\n\n');
- }
-
- if (workerErrs.length > 0) {
- var stackTraces = workerErrs.map(function(e) {
- return e.stack || e.err;
- });
-
- var err = new Error(prepareMsg(stackTraces) + '\n');
-
- // Avoid having any stack traces omitted from the logs
- var maxLogLine = 10 * 1024; // 10KB
-
- // Check if the combined length of the error message and the stack traces
- // exceeds the maximum line-length the shell will log
- if (err.stack.length >= maxLogLine) {
- print(err.stack);
- throw new Error('stack traces would have been snipped, see logs');
- }
-
- throw err;
- }
-}
-
-workerThread.fsm = function(workloads, args) {
- load('jstests/parallel/fsm_libs/worker_thread.js'); // for workerThread.main
- load('jstests/parallel/fsm_libs/fsm.js'); // for fsm.run
-
- return workerThread.main(workloads, args, function(configs) {
- var workloads = Object.keys(configs);
- assert.eq(1, workloads.length);
- fsm.run(configs[workloads[0]]);
- });
-};
-
-workerThread.composed = function(workloads, args) {
- load('jstests/parallel/fsm_libs/worker_thread.js'); // for workerThread.main
- load('jstests/parallel/fsm_libs/composer.js'); // for composer.run
-
- return workerThread.main(workloads, args, function(configs) {
- // TODO: make mixing probability configurable
- composer.run(workloads, configs, 0.1);
- });
-};
diff --git a/jstests/parallel/fsm_libs/utils.js b/jstests/parallel/fsm_libs/utils.js
deleted file mode 100644
index a9fa8fe0603..00000000000
--- a/jstests/parallel/fsm_libs/utils.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// Returns a unique database name:
-// db0, db1, ...
-var uniqueDBName = (function() {
- var i = 0;
-
- return function() {
- return 'db' + i++;
- };
-})();
-
-// Returns a unique collection name:
-// coll0, coll1, ...
-var uniqueCollName = (function() {
- var i = 0;
-
- return function() {
- return 'coll' + i++;
- };
-})();
diff --git a/jstests/parallel/fsm_libs/worker_thread.js b/jstests/parallel/fsm_libs/worker_thread.js
deleted file mode 100644
index 01dfc29f694..00000000000
--- a/jstests/parallel/fsm_libs/worker_thread.js
+++ /dev/null
@@ -1,74 +0,0 @@
-var workerThread = (function() {
-
- // workloads = list of workload filenames
- // args.tid = the thread identifier
- // args.latch = the CountDownLatch instance for starting all threads
- // args.dbName = the database name
- // args.collName = the collection name
- // args.clusterOptions = the configuration of the cluster
- // args.seed = seed for the random number generator
- // args.globalAssertLevel = the global assertion level to use
- // run = callback that takes a map of workloads to their associated $config
- function main(workloads, args, run) {
- var myDB;
- var configs = {};
-
- try {
- load('jstests/parallel/fsm_libs/assert.js');
- globalAssertLevel = args.globalAssertLevel;
-
- if (args.clusterOptions.addr) {
- // We won't use the implicit db connection created within the thread's scope, so
- // forcibly clean it up before creating a new connection.
- db = null;
- gc();
-
- myDB = new Mongo(args.clusterOptions.addr).getDB(args.dbName);
- } else {
- myDB = db.getSiblingDB(args.dbName);
- }
-
- load('jstests/parallel/fsm_libs/runner.js'); // for parseConfig
- workloads.forEach(function(workload) {
- load(workload);
- var config = parseConfig($config); // to normalize
- config.data.tid = args.tid;
- configs[workload] = {
- data: config.data,
- db: myDB,
- collName: args.collName,
- startState: config.startState,
- states: config.states,
- transitions: config.transitions,
- iterations: config.iterations
- };
- });
-
- args.latch.countDown();
-
- // Converts any exceptions to a return status. In order for the
- // parent thread to call countDown() on our behalf, we must throw
- // an exception. Nothing prior to (and including) args.latch.countDown()
- // should be wrapped in a try/catch statement.
- try {
- args.latch.await(); // wait for all threads to start
-
- Random.setRandomSeed(args.seed);
- run(configs);
- return { ok: 1 };
- } catch(e) {
- return { ok: 0, err: e.toString(), stack: e.stack };
- }
- } finally {
- // Avoid retention of connection object
- configs = null;
- myDB = null;
- gc();
- }
- }
-
- return {
- main: main
- };
-
-})();
diff --git a/jstests/parallel/fsm_selftests.js b/jstests/parallel/fsm_selftests.js
deleted file mode 100644
index 910c4916be6..00000000000
--- a/jstests/parallel/fsm_selftests.js
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * This file tests the FSM test framework.
- */
-
-load('jstests/parallel/fsm_libs/fsm.js');
-
-(function() {
- var getWeightedRandomChoice = fsm._getWeightedRandomChoice;
-
- var doc = {
- a: 0.25,
- b: 0.5,
- c: 0.25
- };
-
- // NOTE: getWeightedRandomChoice calls assert internally, so it will print stack traces
- // when assert.throws executes
- assert.throws(function() { getWeightedRandomChoice(doc, -1); }, [],
- 'should reject negative values');
- assert.throws(function() { getWeightedRandomChoice(doc, 1); }, [],
- 'should reject values == 1');
- assert.throws(function() { getWeightedRandomChoice(doc, 2); }, [],
- 'should reject values > 1');
-
- assert.throws(function() { getWeightedRandomChoice({}, 0.0); }, [],
- 'cannot choose from zero states');
- assert.throws(function() { getWeightedRandomChoice({}, 0.5); }, [],
- 'cannot choose from zero states');
- assert.throws(function() { getWeightedRandomChoice({}, 0.99); }, [],
- 'cannot choose from zero states');
-
- assert.eq('a', getWeightedRandomChoice(doc, 0.00), '0');
- assert.eq('a', getWeightedRandomChoice(doc, 0.24), '1');
- assert.eq('b', getWeightedRandomChoice(doc, 0.25), '2');
- assert.eq('b', getWeightedRandomChoice(doc, 0.50), '3');
- assert.eq('b', getWeightedRandomChoice(doc, 0.74), '4');
- assert.eq('c', getWeightedRandomChoice(doc, 0.75), '5');
- assert.eq('c', getWeightedRandomChoice(doc, 0.99), '6');
-})();
diff --git a/jstests/parallel/fsm_workload_helpers/indexed_noindex.js b/jstests/parallel/fsm_workload_helpers/indexed_noindex.js
deleted file mode 100644
index 7986bfd79cd..00000000000
--- a/jstests/parallel/fsm_workload_helpers/indexed_noindex.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/**
- * indexed_noindex.js
- *
- * Defines a modifier for indexed workloads that drops the index, specified by
- * $config.data.getIndexSpec(), at the end of the workload setup.
- */
-function indexedNoindex($config, $super) {
-
- $config.setup = function(db, collName) {
- $super.setup.apply(this, arguments);
-
- var res = db[collName].dropIndex(this.getIndexSpec());
- assertAlways.commandWorked(res);
- };
-
- return $config;
-}
diff --git a/jstests/parallel/fsm_workloads/findAndModify_inc.js b/jstests/parallel/fsm_workloads/findAndModify_inc.js
deleted file mode 100644
index 125b7d4f474..00000000000
--- a/jstests/parallel/fsm_workloads/findAndModify_inc.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * findAndModify_inc.js
- *
- * Inserts a single document into a collection. Each thread performs a
- * findAndModify command to select the document and increment a particular
- * field. Asserts that the field has the correct value based on the number
- * of increments performed.
- *
- * This workload was designed to reproduce SERVER-15892.
- */
-var $config = (function() {
-
- var states = {
-
- init: function init(db, collName) {
- this.fieldName = 't' + this.tid;
- this.count = 0;
- },
-
- update: function update(db, collName) {
- var updateDoc = { $inc: {} };
- updateDoc.$inc[this.fieldName] = 1;
- db[collName].findAndModify({
- query: { _id: 'findAndModify_inc' },
- update: updateDoc
- });
- ++this.count;
- },
-
- find: function find(db, collName) {
- var docs = db[collName].find().toArray();
- assertWhenOwnColl.eq(1, docs.length);
- assertWhenOwnColl((function() {
- var doc = docs[0];
- assertWhenOwnColl.eq(this.count, doc[this.fieldName]);
- }).bind(this));
- }
-
- };
-
- var transitions = {
- init: { update: 1 },
- update: { find: 1 },
- find: { update: 1 }
- };
-
- function setup(db, collName) {
- db[collName].insert({ _id: 'findAndModify_inc' });
- }
-
- return {
- threadCount: 30,
- iterations: 100,
- states: states,
- transitions: transitions,
- setup: setup
- };
-
-})();
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_1char.js b/jstests/parallel/fsm_workloads/indexed_insert_1char.js
deleted file mode 100644
index 3e358bbfca3..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_1char.js
+++ /dev/null
@@ -1,20 +0,0 @@
-/**
- * indexed_insert_1char.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan. The indexed
- * value is a 1-character string based on the thread's id.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for parseConfig
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-
-var $config = extendWorkload($config, function($config, $super) {
-
- $config.states.init = function(db, collName) {
- $super.states.init.apply(this, arguments);
-
- this.indexedValue = String.fromCharCode(33 + this.tid);
- };
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_1char_noindex.js b/jstests/parallel/fsm_workloads/indexed_insert_1char_noindex.js
deleted file mode 100644
index 70c70c7e8d8..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_1char_noindex.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * indexed_insert_1char_noindex.js
- *
- * Executes the indexed_insert_1char.js workload after dropping its index.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_1char.js'); // for $config
-load('jstests/parallel/fsm_workload_helpers/indexed_noindex.js'); // for indexedNoindex
-
-var $config = extendWorkload($config, indexedNoindex);
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_base.js b/jstests/parallel/fsm_workloads/indexed_insert_base.js
deleted file mode 100644
index 09566b8b04b..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_base.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/**
- * indexed_insert_base.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan. The indexed
- * value is the thread's id.
- */
-var $config = (function() {
-
- var states = {
- init: function init(db, collName) {
- this.nInserted = 0;
- this.indexedValue = this.tid;
- },
-
- insert: function insert(db, collName) {
- var res = db[collName].insert(this.getDoc());
- assertAlways.eq(1, res.nInserted, tojson(res));
- this.nInserted += this.docsPerInsert;
- },
-
- find: function find(db, collName) {
- // collection scan
- var count = db[collName].find(this.getDoc()).sort({ $natural: 1 }).itcount();
- assertWhenOwnColl.eq(count, this.nInserted);
-
- // index scan
- count = db[collName].find(this.getDoc()).sort(this.getIndexSpec()).itcount();
- assertWhenOwnColl.eq(count, this.nInserted);
- }
- };
-
- var transitions = {
- init: { insert: 1 },
- insert: { find: 1 },
- find: { insert: 1 }
- };
-
- function setup(db, collName) {
- db[collName].ensureIndex(this.getIndexSpec());
- }
-
- return {
- threadCount: 30,
- iterations: 100,
- states: states,
- transitions: transitions,
- data: {
- getIndexSpec: function() {
- var ixSpec = {};
- ixSpec[this.indexedField] = 1;
- return ixSpec;
- },
- getDoc: function() {
- var doc = {};
- doc[this.indexedField] = this.indexedValue;
- return doc;
- },
- indexedField: 'x',
- docsPerInsert: 1
- },
- setup: setup
- };
-
-})();
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_base_noindex.js b/jstests/parallel/fsm_workloads/indexed_insert_base_noindex.js
deleted file mode 100644
index ebee79c20ca..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_base_noindex.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * indexed_insert_base_noindex.js
- *
- * Executes the indexed_insert_base.js workload after dropping its index.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-load('jstests/parallel/fsm_workload_helpers/indexed_noindex.js'); // for indexedNoindex
-
-var $config = extendWorkload($config, indexedNoindex);
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_heterogeneous.js b/jstests/parallel/fsm_workloads/indexed_insert_heterogeneous.js
deleted file mode 100644
index ee9470d68d4..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_heterogeneous.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * indexed_insert_heterogeneous.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan. The indexed
- * value is a different BSON type, depending on the thread's id.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-
-var $config = extendWorkload($config, function($config, $super) {
-
- $config.states.init = function(db, collName) {
- $super.states.init.apply(this, arguments);
-
- // prefix str with zeroes to make it have length len
- function pad(len, str) {
- var padding = new Array(len + 1).join('0');
- return (padding + str).slice(-len);
- }
-
- function makeOID(tid) {
- var str = pad(24, tid.toString(16));
- return ObjectId(str);
- }
-
- function makeDate(tid) {
- var d = ISODate("2000-01-01T00:00:00.000Z");
- // setSeconds(n) where n >= 60 will just cause the minutes, hours, etc to increase,
- // so this produces a unique date for each tid
- d.setSeconds(tid);
- return d;
- }
-
- var choices = [
- this.tid, // int
- "" + this.tid, // string
- this.tid * 0.0001, // float
- { tid: this.tid }, // subdocument
- makeOID(this.tid), // objectid
- makeDate(this.tid), // date
- new Function('', 'return ' + this.tid + ';') // function
- ];
-
- this.indexedValue = choices[this.tid % choices.length];
- };
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_heterogeneous_noindex.js b/jstests/parallel/fsm_workloads/indexed_insert_heterogeneous_noindex.js
deleted file mode 100644
index 02a31d56356..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_heterogeneous_noindex.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * indexed_insert_heterogeneous_noindex.js
- *
- * Executes the indexed_insert_heterogeneous.js workload after dropping its index.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_heterogeneous.js'); // for $config
-load('jstests/parallel/fsm_workload_helpers/indexed_noindex.js'); // for indexedNoindex
-
-var $config = extendWorkload($config, indexedNoindex);
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_large.js b/jstests/parallel/fsm_workloads/indexed_insert_large.js
deleted file mode 100644
index fb4f34d2e0a..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_large.js
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * indexed_insert_large.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan. The indexed
- * value is a string large enough to make the whole index key be 1K, which is
- * the maximum.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for parseConfig
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-
-var $config = extendWorkload($config, function($config, $super) {
-
- $config.states.init = function(db, collName) {
- $super.states.init.apply(this, arguments);
-
- // "The total size of an index entry, which can include structural overhead depending on the
- // BSON type, must be less than 1024 bytes."
- // http://docs.mongodb.org/manual/reference/limits/
- var maxIndexedSize = 1023;
-
- var bsonOverhead = Object.bsonsize({ '': '' });
-
- var bigstr = new Array(maxIndexedSize + 1).join('x');
-
- // prefix the big string with tid to make it unique,
- // then trim it down so that it plus bson overhead is maxIndexedSize
-
- this.indexedValue = (this.tid + bigstr).slice(0, maxIndexedSize - bsonOverhead);
-
- assertAlways.eq(maxIndexedSize, Object.bsonsize({ '': this.indexedValue }),
- "buggy test: the inserted docs won't have the expected index-key size");
- };
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_large_noindex.js b/jstests/parallel/fsm_workloads/indexed_insert_large_noindex.js
deleted file mode 100644
index 88350e6db08..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_large_noindex.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * indexed_insert_large_noindex.js
- *
- * Executes the indexed_insert_large.js workload after dropping its index.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_large.js'); // for $config
-load('jstests/parallel/fsm_workload_helpers/indexed_noindex.js'); // for indexedNoindex
-
-var $config = extendWorkload($config, indexedNoindex);
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_long_fieldname.js b/jstests/parallel/fsm_workloads/indexed_insert_long_fieldname.js
deleted file mode 100644
index 55fbdb5b42a..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_long_fieldname.js
+++ /dev/null
@@ -1,16 +0,0 @@
-/**
- * indexed_insert_long_fieldname.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan. The indexed
- * field name is a long string.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-
-var $config = extendWorkload($config, function($config, $super) {
-
- $config.data.indexedField = 'Supercalifragilisticexpialidocious';
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_long_fieldname_noindex.js b/jstests/parallel/fsm_workloads/indexed_insert_long_fieldname_noindex.js
deleted file mode 100644
index 9c33b5ff876..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_long_fieldname_noindex.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * indexed_insert_long_fieldname_noindex.js
- *
- * Executes the indexed_insert_long_fieldname.js workload after dropping its index.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_long_fieldname.js'); // for $config
-load('jstests/parallel/fsm_workload_helpers/indexed_noindex.js'); // for indexedNoindex
-
-var $config = extendWorkload($config, indexedNoindex);
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_multikey.js b/jstests/parallel/fsm_workloads/indexed_insert_multikey.js
deleted file mode 100644
index 825c08718f7..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_multikey.js
+++ /dev/null
@@ -1,22 +0,0 @@
-/**
- * indexed_insert_multikey.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan. The indexed
- * value is an array of numbers.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for parseConfig
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-
-var $config = extendWorkload($config, function($config, $super) {
-
- $config.states.init = function(db, collName) {
- $super.states.init.apply(this, arguments);
-
- this.indexedValue = [0,1,2,3,4,5,6,7,8,9].map(function(n) {
- return this.tid * 10 + n;
- }.bind(this));
- };
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_multikey_noindex.js b/jstests/parallel/fsm_workloads/indexed_insert_multikey_noindex.js
deleted file mode 100644
index f1b7d72405e..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_multikey_noindex.js
+++ /dev/null
@@ -1,10 +0,0 @@
-/**
- * indexed_insert_multikey_noindex.js
- *
- * Executes the indexed_insert_multikey.js workload after dropping its index.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_multikey.js'); // for $config
-load('jstests/parallel/fsm_workload_helpers/indexed_noindex.js'); // for indexedNoindex
-
-var $config = extendWorkload($config, indexedNoindex);
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_ordered_bulk.js b/jstests/parallel/fsm_workloads/indexed_insert_ordered_bulk.js
deleted file mode 100644
index 84d94c10e60..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_ordered_bulk.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * indexed_insert_ordered_bulk.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan.
- *
- * Uses an ordered, bulk operation to perform the inserts.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-
-var $config = extendWorkload($config, function($config, $super) {
-
- $config.states.insert = function(db, collName) {
- var doc = {};
- doc[this.indexedField] = this.indexedValue;
-
- var bulk = db[collName].initializeOrderedBulkOp();
- for (var i = 0; i < this.docsPerInsert; ++i) {
- bulk.insert(doc);
- }
- assertWhenOwnColl.writeOK(bulk.execute());
-
- this.nInserted += this.docsPerInsert;
- };
-
- $config.data.docsPerInsert = 15;
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_workloads/indexed_insert_unordered_bulk.js b/jstests/parallel/fsm_workloads/indexed_insert_unordered_bulk.js
deleted file mode 100644
index 468ddef6bf2..00000000000
--- a/jstests/parallel/fsm_workloads/indexed_insert_unordered_bulk.js
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * indexed_insert_unordered_bulk.js
- *
- * Inserts multiple documents into an indexed collection. Asserts that all
- * documents appear in both a collection scan and an index scan.
- *
- * Uses an unordered, bulk operation to perform the inserts.
- */
-load('jstests/parallel/fsm_libs/runner.js'); // for extendWorkload
-load('jstests/parallel/fsm_workloads/indexed_insert_base.js'); // for $config
-
-var $config = extendWorkload($config, function($config, $super) {
-
- $config.states.insert = function(db, collName) {
- var doc = {};
- doc[this.indexedField] = this.indexedValue;
-
- var bulk = db[collName].initializeUnorderedBulkOp();
- for (var i = 0; i < this.docsPerInsert; ++i) {
- bulk.insert(doc);
- }
- assertWhenOwnColl.writeOK(bulk.execute());
-
- this.nInserted += this.docsPerInsert;
- };
-
- $config.data.docsPerInsert = 15;
-
- return $config;
-});
diff --git a/jstests/parallel/fsm_workloads/update_inc.js b/jstests/parallel/fsm_workloads/update_inc.js
deleted file mode 100644
index 8590cc91130..00000000000
--- a/jstests/parallel/fsm_workloads/update_inc.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * update_inc.js
- *
- * Inserts a single document into a collection. Each thread performs an
- * update operation to select the document and increment a particular
- * field. Asserts that the field has the correct value based on the number
- * of increments performed.
- */
-var $config = (function() {
-
- var data = {
- // uses the workload name as _id on the document.
- // assumes this name will be unique.
- id: 'update_inc'
- };
-
- var states = {
- init: function init(db, collName) {
- this.fieldName = 't' + this.tid;
- this.count = 0;
- },
-
- update: function update(db, collName) {
- var updateDoc = { $inc: {} };
- updateDoc.$inc[this.fieldName] = 1;
-
- var res = db[collName].update({ _id: this.id }, updateDoc);
- assertAlways.eq(0, res.nUpserted, tojson(res));
- assertWhenOwnColl.eq(1, res.nMatched, tojson(res));
-
- if (db.getMongo().writeMode() === 'commands') {
- assertWhenOwnColl.eq(1, res.nModified, tojson(res));
- }
-
- ++this.count;
- },
-
- find: function find(db, collName) {
- var docs = db[collName].find().toArray();
- assertWhenOwnColl.eq(1, docs.length);
- assertWhenOwnColl((function() {
- var doc = docs[0];
- assertWhenOwnColl.eq(this.count, doc[this.fieldName]);
- }).bind(this));
- }
- };
-
- var transitions = {
- init: { update: 1 },
- update: { find: 1 },
- find: { update: 1 }
- };
-
- function setup(db, collName) {
- db[collName].insert({ _id: this.id });
- }
-
- return {
- threadCount: 30,
- iterations: 100,
- data: data,
- states: states,
- transitions: transitions,
- setup: setup
- };
-
-})();
diff --git a/jstests/parallel/fsm_workloads/update_ordered_bulk_inc.js b/jstests/parallel/fsm_workloads/update_ordered_bulk_inc.js
deleted file mode 100644
index 0dceb47f28b..00000000000
--- a/jstests/parallel/fsm_workloads/update_ordered_bulk_inc.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/**
- * update_ordered_bulk_inc.js
- *
- * Inserts multiple documents into a collection. Each thread performs a
- * bulk update operation to select the document and increment a particular
- * field. Asserts that the field has the correct value based on the number
- * of increments performed.
- *
- * Uses an ordered, bulk operation to perform the updates.
- */
-var $config = (function() {
-
- var states = {
- init: function init(db, collName) {
- this.fieldName = 't' + this.tid;
- },
-
- update: function update(db, collName) {
- var updateDoc = { $inc: {} };
- updateDoc.$inc[this.fieldName] = 1;
-
- var bulk = db[collName].initializeOrderedBulkOp();
- for (var i = 0; i < this.docCount; ++i) {
- bulk.find({ _id: i }).update(updateDoc);
- }
- var result = bulk.execute();
- // TODO: this actually does assume that there are no unique indexes.
- // but except for weird cases like that, it is valid even when other
- // threads are modifying the same collection
- assertAlways.eq(0, result.getWriteErrorCount());
-
- ++this.count;
- },
-
- find: function find(db, collName) {
- var docs = db[collName].find().toArray();
- assertWhenOwnColl.eq(this.docCount, docs.length);
-
- docs.forEach(function (doc) {
- assertWhenOwnColl.eq(this.count, doc[this.fieldName]);
- });
- }
- };
-
- var transitions = {
- init: { update: 1 },
- update: { find: 1 },
- find: { update: 1 }
- };
-
- function setup(db, collName) {
- this.count = 0;
- for (var i = 0; i < this.docCount; ++i) {
- db[collName].insert({ _id: i });
- }
- }
-
- return {
- threadCount: 30,
- iterations: 100,
- states: states,
- transitions: transitions,
- setup: setup,
- data: {
- docCount: 15
- }
- };
-
-})();