diff options
Diffstat (limited to 'bench/workgen/workgen.h')
-rw-r--r-- | bench/workgen/workgen.h | 410 |
1 files changed, 0 insertions, 410 deletions
diff --git a/bench/workgen/workgen.h b/bench/workgen/workgen.h deleted file mode 100644 index c1ae01ed5a4..00000000000 --- a/bench/workgen/workgen.h +++ /dev/null @@ -1,410 +0,0 @@ -/*- - * Public Domain 2014-2017 MongoDB, Inc. - * Public Domain 2008-2014 WiredTiger, Inc. - * - * This is free and unencumbered software released into the public domain. - * - * Anyone is free to copy, modify, publish, use, compile, sell, or - * distribute this software, either in source code form or as a compiled - * binary, for any purpose, commercial or non-commercial, and by any - * means. - * - * In jurisdictions that recognize copyright laws, the author or authors - * of this software dedicate any and all copyright interest in the - * software to the public domain. We make this dedication for the benefit - * of the public at large and to the detriment of our heirs and - * successors. We intend this dedication to be an overt act of - * relinquishment in perpetuity of all present and future rights to this - * software under copyright law. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. - * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR - * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, - * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ -#include <ostream> -#include <string> -#include <vector> -#include <map> - -namespace workgen { - -struct ContextInternal; -struct TableInternal; -struct Thread; -struct Transaction; - -#ifndef SWIG -struct OptionsList { - OptionsList(); - OptionsList(const OptionsList &other); - - void add_int(const char *name, int default_value, const char *desc); - void add_bool(const char *name, bool default_value, const char *desc); - void add_double(const char *name, double default_value, const char *desc); - void add_string(const char *name, const std::string &default_value, - const char *desc); - - std::string help() const; - std::string help_description(const char *option_name) const; - std::string help_type(const char *option_name) const; - -private: - void add_option(const char *name, const std::string typestr, - const char *desc); - typedef std::pair<std::string, std::string> TypeDescPair; - std::map<std::string, TypeDescPair> _option_map; -}; -#endif - -// These classes are all exposed to Python via SWIG. While they may contain -// data that is private to C++, such data must not prevent the objects from -// being shared. Tables, Keys, Values, Operations and Threads can be shared: a -// single Key object might appear in many operations; Operations may appear -// multiple times in a Thread or in different Threads; the same Thread may -// appear multiple times in a Workload list, etc. -// -// Certain kinds of state are allowed: A Table contains a unique pointer that -// is used within the internal part of the Context. Stats contain lots -// of state, but is made available after a Workload.run(). -// -// Python controls the lifetime of (nearly) all objects of these classes. -// The exception is Stat/Track objects, which are also created/used -// internally to calculate and show statistics during a run. -// -struct Track { - // Threads maintain the total thread operation and total latency they've - // experienced. - - uint64_t ops; // Total operations */ - uint64_t latency_ops; // Total ops sampled for latency - uint64_t latency; // Total latency */ - - // Minimum/maximum latency, shared with the monitor thread, that is, the - // monitor thread clears it so it's recalculated again for each period. - - uint32_t min_latency; // Minimum latency (uS) - uint32_t max_latency; // Maximum latency (uS) - - Track(bool latency_tracking = false); - Track(const Track &other); - ~Track(); - - void add(Track&, bool reset = false); - void assign(const Track&); - uint64_t average_latency() const; - void clear(); - void incr(); - void incr_with_latency(uint64_t usecs); - void smooth(const Track&); - void subtract(const Track&); - void track_latency(bool); - bool track_latency() const { return (us != NULL); } - - void _get_us(long *); - void _get_ms(long *); - void _get_sec(long *); - -private: - // Latency buckets. From python, accessed via methods us(), ms(), sec() - uint32_t *us; // < 1us ... 1000us - uint32_t *ms; // < 1ms ... 1000ms - uint32_t *sec; // < 1s 2s ... 100s - - Track & operator=(const Track &other); // use explicit assign method -}; - -struct Stats { - Track insert; - Track not_found; - Track read; - Track remove; - Track update; - Track truncate; - - Stats(bool latency = false); - Stats(const Stats &other); - ~Stats(); - - void add(Stats&, bool reset = false); - void assign(const Stats&); - void clear(); - void describe(std::ostream &os) const; -#ifndef SWIG - void final_report(std::ostream &os, timespec &totalsecs) const; - void report(std::ostream &os) const; -#endif - void smooth(const Stats&); - void subtract(const Stats&); - void track_latency(bool); - bool track_latency() const { return (insert.track_latency()); } - -private: - Stats & operator=(const Stats &other); // use explicit assign method -}; - -// A Context tracks the current record number for each uri, used -// for key generation. -// -struct Context { - bool _verbose; - ContextInternal *_internal; - - Context(); - ~Context(); - void describe(std::ostream &os) const { - os << "Context: verbose " << (_verbose ? "true" : "false"); - } - -#ifndef SWIG - Context& operator=(const Context &other); -#endif -}; - -// To prevent silent errors, this class is set up in Python so that new -// properties are prevented, only existing properties can be set. -// -struct TableOptions { - int key_size; - int value_size; - - TableOptions(); - TableOptions(const TableOptions &other); - ~TableOptions(); - - void describe(std::ostream &os) const { - os << "key_size " << key_size; - os << ", value_size " << value_size; - } - - std::string help() const { return _options.help(); } - std::string help_description(const char *option_name) const { - return _options.help_description(option_name); } - std::string help_type(const char *option_name) const { - return _options.help_type(option_name); } - -private: - OptionsList _options; -}; - -struct Table { - TableOptions options; - std::string _uri; - TableInternal *_internal; - - /* XXX select table from range */ - - Table(); - Table(const char *tablename); - Table(const Table &other); - ~Table(); - - void describe(std::ostream &os) const; - -#ifndef SWIG - Table& operator=(const Table &other); -#endif -}; - -struct Key { - typedef enum { - KEYGEN_AUTO, KEYGEN_APPEND, KEYGEN_PARETO, KEYGEN_UNIFORM } KeyType; - KeyType _keytype; - int _size; - - /* XXX specify more about key distribution */ - Key() : _keytype(KEYGEN_AUTO), _size(0) {} - Key(KeyType keytype, int size) : _keytype(keytype), _size(size) {} - Key(const Key &other) : _keytype(other._keytype), _size(other._size) {} - ~Key() {} - - void describe(std::ostream &os) const { - os << "Key: type " << _keytype << ", size " << _size; } -}; - -struct Value { - int _size; - - /* XXX specify how value is calculated */ - Value() : _size(0) {} - Value(int size) : _size(size) {} - Value(const Value &other) : _size(other._size) {} - ~Value() {} - - void describe(std::ostream &os) const { os << "Value: size " << _size; } -}; - -struct Operation { - enum OpType { - OP_NONE, OP_INSERT, OP_REMOVE, OP_SEARCH, OP_UPDATE }; - OpType _optype; - - Table _table; - Key _key; - Value _value; - Transaction *_transaction; - std::vector<Operation> *_group; - int _repeatgroup; - -#ifndef SWIG - int _keysize; // derived from Key._size and Table.options.key_size - int _valuesize; - uint64_t _keymax; - uint64_t _valuemax; -#endif - - Operation(); - Operation(OpType optype, Table table, Key key, Value value); - Operation(OpType optype, Table table, Key key); - Operation(OpType optype, Table table); - Operation(const Operation &other); - ~Operation(); - - void describe(std::ostream &os) const; -#ifndef SWIG - Operation& operator=(const Operation &other); - void get_static_counts(Stats &stats, int multiplier); - void kv_compute_max(bool); - void kv_gen(bool, uint64_t, char *) const; - void kv_size_buffer(bool iskey, size_t &size) const; - void size_check() const; -#endif -}; - -// To prevent silent errors, this class is set up in Python so that new -// properties are prevented, only existing properties can be set. -// -struct ThreadOptions { - std::string name; - double throttle; - double throttle_burst; - - ThreadOptions(); - ThreadOptions(const ThreadOptions &other); - ~ThreadOptions(); - - void describe(std::ostream &os) const { - os << "throttle " << throttle; - } - - std::string help() const { return _options.help(); } - std::string help_description(const char *option_name) const { - return _options.help_description(option_name); } - std::string help_type(const char *option_name) const { - return _options.help_type(option_name); } - -private: - OptionsList _options; -}; - -// This is a list of threads, which may be used in the Workload constructor. -// It participates with ThreadList defined on the SWIG/Python side and -// some Python operators added to Thread to allow Threads to be easily -// composed using '+' and multiplied (by integer counts) using '*'. -// Users of the workgen API in Python don't ever need to use -// ThreadListWrapper or ThreadList. -struct ThreadListWrapper { - std::vector<Thread> _threads; - - ThreadListWrapper() : _threads() {} - ThreadListWrapper(const ThreadListWrapper &other) : - _threads(other._threads) {} - ThreadListWrapper(const std::vector<Thread> &threads) : _threads(threads) {} - void extend(const ThreadListWrapper &); - void append(const Thread &); - void multiply(const int); -}; - -struct Thread { - ThreadOptions options; - Operation _op; - - Thread(); - Thread(const Operation &op); - Thread(const Thread &other); - ~Thread(); - - void describe(std::ostream &os) const; -}; - -struct Transaction { - bool _rollback; - std::string _begin_config; - std::string _commit_config; - - Transaction(const char *_config = NULL) : _rollback(false), - _begin_config(_config == NULL ? "" : _config), _commit_config() {} - - void describe(std::ostream &os) const { - os << "Transaction: "; - if (_rollback) - os << "(rollback) "; - os << "begin_config: " << _begin_config; - if (!_commit_config.empty()) - os << ", commit_config: " << _commit_config; - } -}; - -// To prevent silent errors, this class is set up in Python so that new -// properties are prevented, only existing properties can be set. -// -struct WorkloadOptions { - int max_latency; - std::string report_file; - int report_interval; - int run_time; - int sample_interval; - int sample_rate; - - WorkloadOptions(); - WorkloadOptions(const WorkloadOptions &other); - ~WorkloadOptions(); - - void describe(std::ostream &os) const { - os << "run_time " << run_time; - os << ", report_interval " << report_interval; - } - - std::string help() const { return _options.help(); } - std::string help_description(const char *option_name) const { - return _options.help_description(option_name); } - std::string help_type(const char *option_name) const { - return _options.help_type(option_name); } - -private: - OptionsList _options; -}; - -struct Workload { - WorkloadOptions options; - Stats stats; - Context *_context; - std::vector<Thread> _threads; - - Workload(Context *context, const ThreadListWrapper &threadlist); - Workload(Context *context, const Thread &thread); - Workload(const Workload &other); - ~Workload(); - -#ifndef SWIG - Workload& operator=(const Workload &other); -#endif - - void describe(std::ostream &os) const { - os << "Workload: "; - _context->describe(os); - os << ", "; - options.describe(os); - os << ", [" << std::endl; - for (std::vector<Thread>::const_iterator i = _threads.begin(); i != _threads.end(); i++) { - os << " "; i->describe(os); os << std::endl; - } - os << "]"; - } - int run(WT_CONNECTION *conn); -}; - -}; |