summaryrefslogtreecommitdiff
path: root/src/mongo/shell
diff options
context:
space:
mode:
authordalyd <david.daly@mongodb.com>2015-05-08 09:43:43 -0400
committerdalyd <david.daly@mongodb.com>2015-05-28 13:22:57 -0400
commitacc1ebc194ab01f81750a4e60dc78a3a9bac650f (patch)
tree1aeff03b58e60d4d0d998657c19b2f1a9dc3ef68 /src/mongo/shell
parent7d526bbc47681fd297d38cdc577a9a7d710f7a99 (diff)
downloadmongo-acc1ebc194ab01f81750a4e60dc78a3a9bac650f.tar.gz
SERVER-13237: benchRun should use a thread-safe random number generator
Diffstat (limited to 'src/mongo/shell')
-rw-r--r--src/mongo/shell/bench.cpp17
-rw-r--r--src/mongo/shell/bench.h7
2 files changed, 18 insertions, 6 deletions
diff --git a/src/mongo/shell/bench.cpp b/src/mongo/shell/bench.cpp
index ae4fe3e0e59..9f016a5b65f 100644
--- a/src/mongo/shell/bench.cpp
+++ b/src/mongo/shell/bench.cpp
@@ -155,6 +155,7 @@ namespace mongo {
throwGLE = false;
breakOnTrap = true;
+ randomSeed = 1314159265358979323;
}
BenchRunConfig *BenchRunConfig::createFromBson( const BSONObj &args ) {
@@ -177,6 +178,8 @@ namespace mongo {
if ( args["parallel"].isNumber() )
this->parallel = args["parallel"].numberInt();
+ if ( args["randomSeed"].isNumber() )
+ this->randomSeed = args["randomSeed"].numberInt();
if ( args["seconds"].isNumber() )
this->seconds = args["seconds"].number();
if ( ! args["hideResults"].eoo() )
@@ -320,8 +323,9 @@ namespace mongo {
return b.obj();
}
- BenchRunWorker::BenchRunWorker(size_t id, const BenchRunConfig *config, BenchRunState *brState)
- : _id(id), _config(config), _brState(brState) {
+ BenchRunWorker::BenchRunWorker(size_t id, const BenchRunConfig *config, BenchRunState *brState,
+ int64_t randomSeed)
+ : _id(id), _config(config), _brState(brState), _randomSeed(randomSeed) {
}
BenchRunWorker::~BenchRunWorker() {}
@@ -341,7 +345,7 @@ namespace mongo {
long long count = 0;
mongo::Timer timer;
- BsonTemplateEvaluator bsonTemplateEvaluator;
+ BsonTemplateEvaluator bsonTemplateEvaluator(_randomSeed);
invariant(bsonTemplateEvaluator.setId(_id) == BsonTemplateEvaluator::StatusSuccess);
if (_config->username != "") {
@@ -785,8 +789,11 @@ namespace mongo {
}
// Start threads
- for ( unsigned i = 0; i < _config->parallel; i++ ) {
- BenchRunWorker *worker = new BenchRunWorker(i, _config.get(), &_brState);
+ for ( int64_t i = 0; i < _config->parallel; i++ ) {
+ // Make a unique random seed for the worker.
+ int64_t seed = _config->randomSeed + i;
+ BenchRunWorker *worker = new BenchRunWorker(i, _config.get(),
+ &_brState, seed);
worker->start();
_workers.push_back(worker);
}
diff --git a/src/mongo/shell/bench.h b/src/mongo/shell/bench.h
index f7a58799465..280d7c1399d 100644
--- a/src/mongo/shell/bench.h
+++ b/src/mongo/shell/bench.h
@@ -102,6 +102,9 @@ namespace mongo {
*/
double seconds;
+ /// Base random seed for threads
+ int64_t randomSeed;
+
bool hideResults;
bool handleErrors;
bool hideErrors;
@@ -325,7 +328,8 @@ namespace mongo {
*
* "id" is a positive integer which should uniquely identify the worker.
*/
- BenchRunWorker(size_t id, const BenchRunConfig *config, BenchRunState *brState);
+ BenchRunWorker(size_t id, const BenchRunConfig *config,
+ BenchRunState *brState, int64_t randomSeed);
~BenchRunWorker();
/**
@@ -355,6 +359,7 @@ namespace mongo {
const BenchRunConfig *_config;
BenchRunState *_brState;
BenchRunStats _stats;
+ int64_t _randomSeed;
};
/**