From acc1ebc194ab01f81750a4e60dc78a3a9bac650f Mon Sep 17 00:00:00 2001 From: dalyd Date: Fri, 8 May 2015 09:43:43 -0400 Subject: SERVER-13237: benchRun should use a thread-safe random number generator --- src/mongo/shell/bench.cpp | 17 ++++++++++++----- src/mongo/shell/bench.h | 7 ++++++- 2 files changed, 18 insertions(+), 6 deletions(-) (limited to 'src/mongo/shell') 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; }; /** -- cgit v1.2.1