summaryrefslogtreecommitdiff
path: root/bench/workgen/workgen_int.h
diff options
context:
space:
mode:
Diffstat (limited to 'bench/workgen/workgen_int.h')
-rw-r--r--bench/workgen/workgen_int.h206
1 files changed, 206 insertions, 0 deletions
diff --git a/bench/workgen/workgen_int.h b/bench/workgen/workgen_int.h
new file mode 100644
index 00000000000..9283aea1d7b
--- /dev/null
+++ b/bench/workgen/workgen_int.h
@@ -0,0 +1,206 @@
+/*-
+ * 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>
+#include <set>
+#ifndef SWIG
+extern "C" {
+#include "workgen_func.h"
+}
+#endif
+
+namespace workgen {
+
+// A 'tint' or ('table integer') is a unique small value integer
+// assigned to each table URI in use. Currently, we assign it once,
+// and its value persists through the lifetime of the Context.
+typedef uint32_t tint_t;
+
+struct ThreadRunner;
+struct WorkloadRunner;
+
+// A exception generated by the workgen classes. Methods generally return an
+// int errno, so this is useful primarily for notifying the caller about
+// failures in constructors.
+struct WorkgenException {
+ std::string _str;
+ WorkgenException() : _str() {}
+ WorkgenException(int err, const char *msg = NULL) : _str() {
+ if (err != 0)
+ _str += wiredtiger_strerror(err);
+ if (msg != NULL) {
+ if (!_str.empty())
+ _str += ": ";
+ _str += msg;
+ }
+ }
+ WorkgenException(const WorkgenException &other) : _str(other._str) {}
+ ~WorkgenException() {}
+};
+
+struct Throttle {
+ ThreadRunner &_runner;
+ double _throttle;
+ double _burst;
+ timespec _next_div;
+ int64_t _ops_delta;
+ uint64_t _ops_prev; // previously returned value
+ uint64_t _ops_per_div; // statically calculated.
+ uint64_t _ms_per_div; // statically calculated.
+ bool _started;
+
+ Throttle(ThreadRunner &runner, double throttle, double burst);
+ ~Throttle();
+
+ // Called with the number of operations since the last throttle.
+ // Sleeps for any needed amount and returns the number operations the
+ // caller should perform before the next call to throttle.
+ int throttle(uint64_t op_count, uint64_t *op_limit);
+};
+
+// There is one of these per Thread object. It exists for the duration of a
+// call to Workload::run() method.
+struct ThreadRunner {
+ int _errno;
+ WorkgenException _exception;
+ Thread *_thread;
+ Context *_context;
+ ContextInternal *_icontext;
+ Workload *_workload;
+ WorkloadRunner *_wrunner;
+ workgen_random_state *_rand_state;
+ Throttle *_throttle;
+ uint64_t _throttle_ops;
+ uint64_t _throttle_limit;
+ bool _in_transaction;
+ uint32_t _number;
+ Stats _stats;
+
+ typedef enum {
+ USAGE_READ = 0x1, USAGE_WRITE = 0x2, USAGE_MIXED = 0x4 } Usage;
+ std::map<tint_t, uint32_t> _table_usage; // value is Usage
+ WT_CURSOR **_cursors; // indexed by tint_t
+ volatile bool _stop;
+ WT_SESSION *_session;
+ char *_keybuf;
+ char *_valuebuf;
+ bool _repeat;
+
+ ThreadRunner();
+ ~ThreadRunner();
+
+ void free_all();
+ static int cross_check(std::vector<ThreadRunner> &runners);
+
+ int close_all();
+ int create_all(WT_CONNECTION *conn);
+ void get_static_counts(Stats &);
+ int open_all();
+ int run();
+
+ void op_create_all(Operation *, size_t &keysize, size_t &valuesize);
+ uint64_t op_get_key_recno(Operation *, tint_t tint);
+ void op_get_static_counts(Operation *, Stats &, int);
+ int op_run(Operation *);
+
+#ifdef _DEBUG
+ std::stringstream _debug_messages;
+ std::string get_debug();
+#define DEBUG_CAPTURE(runner, expr) runner._debug_messages << expr
+#else
+#define DEBUG_CAPTURE(runner, expr)
+#endif
+};
+
+struct Monitor {
+ int _errno;
+ WorkgenException _exception;
+ WorkloadRunner &_wrunner;
+ volatile bool _stop;
+ pthread_t _handle;
+ std::ostream *_out;
+ std::ostream *_json;
+
+ Monitor(WorkloadRunner &wrunner);
+ ~Monitor();
+ int run();
+};
+
+struct ContextInternal {
+ std::map<std::string, tint_t> _tint; // maps uri -> tint_t
+ std::map<tint_t, std::string> _table_names; // reverse mapping
+ uint64_t *_recno; // # entries per tint_t
+ uint32_t _recno_alloced; // length of allocated _recno
+ tint_t _tint_last; // last tint allocated
+ // unique id per context, to work with multiple contexts, starts at 1.
+ uint32_t _context_count;
+
+ ContextInternal();
+ ~ContextInternal();
+ int create_all();
+};
+
+struct TableInternal {
+ tint_t _tint;
+ uint32_t _context_count;
+
+ TableInternal();
+ TableInternal(const TableInternal &other);
+ ~TableInternal();
+};
+
+// An instance of this class only exists for the duration of one call to a
+// Workload::run() method.
+struct WorkloadRunner {
+ Workload *_workload;
+ std::vector<ThreadRunner> _trunners;
+ std::ostream *_report_out;
+ std::string _wt_home;
+ timespec _start;
+
+ WorkloadRunner(Workload *);
+ ~WorkloadRunner();
+ int run(WT_CONNECTION *conn);
+
+private:
+ int close_all();
+ int create_all(WT_CONNECTION *conn, Context *context);
+ void final_report(timespec &);
+ void get_stats(Stats *stats);
+ int open_all();
+ void open_report_file(std::ofstream &, const char *, const char *);
+ void report(time_t, time_t, Stats *stats);
+ int run_all();
+
+ WorkloadRunner(const WorkloadRunner &); // disallowed
+ WorkloadRunner& operator=(const WorkloadRunner &other); // disallowed
+};
+
+};