summaryrefslogtreecommitdiff
path: root/libs/libmdbx/src/test/main.cc
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2020-01-07 22:56:32 +0300
committerGeorge Hazan <ghazan@miranda.im>2020-01-07 22:56:39 +0300
commit7524acda0a8778572262429f27b359d7ee91fc90 (patch)
tree6443228a439b83c5bc6d15923a9ccd91fa4718e3 /libs/libmdbx/src/test/main.cc
parent62c842df372abe0349f025ac4cbbc8426526ac8b (diff)
libmdbx: update to 0.5.0
Diffstat (limited to 'libs/libmdbx/src/test/main.cc')
-rw-r--r--libs/libmdbx/src/test/main.cc193
1 files changed, 165 insertions, 28 deletions
diff --git a/libs/libmdbx/src/test/main.cc b/libs/libmdbx/src/test/main.cc
index 959359a515..c00837fa72 100644
--- a/libs/libmdbx/src/test/main.cc
+++ b/libs/libmdbx/src/test/main.cc
@@ -1,4 +1,4 @@
-/*
+/*
* Copyright 2017-2019 Leonid Yuriev <leo@yuriev.ru>
* and other libmdbx authors: please see AUTHORS file.
* All rights reserved.
@@ -14,9 +14,100 @@
#include "test.h"
+#if !(defined(_WIN32) || defined(_WIN64))
+#include <sys/resource.h>
+#include <sys/time.h>
+#endif /* !Windows */
+
void __noreturn usage(void) {
- printf("usage:\n"
- "\tFIXME\n");
+ puts(
+ "usage:\n"
+ " --help or -h Show this text\n"
+ "Common parameters:\n"
+ " --pathname=... Path and/or name of database files\n"
+ " --repeat=N Set repeat counter\n"
+ " --threads=N Number of thread (unsunpported for now)\n"
+ " --timeout=N[s|m|h|d] Set timeout in seconds/minutes/hours/days\n"
+ " --failfast[=YES/no] Lill all actors on first failure/error\n"
+ " --max-readers=N See mdbx_env_set_maxreaders() description\n"
+ " --max-tables=N Se mdbx_env_set_maxdbs() description\n"
+ " --dump-config[=YES/no] Dump entire test config before run\n"
+ " --progress[=YES/no] Enable/disable progress `canary`\n"
+ " --console[=yes/no] Enable/disable console-like output\n"
+ " --cleanup-before[=YES/no] Cleanup/remove and re-create database\n"
+ " --cleanup-after[=YES/no] Cleanup/remove database after completion\n"
+ "Database size control:\n"
+ " --pagesize=... Database page size: min, max, 256..65536\n"
+ " --size-lower=N[K|M|G|T] Lower-bound of size in Kb/Mb/Gb/Tb\n"
+ " --size-upper Upper-bound of size in Kb/Mb/Gb/Tb\n"
+ " --size Initial size in Kb/Mb/Gb/Tb\n"
+ " --shrink-threshold Shrink threshold in Kb/Mb/Gb/Tb\n"
+ " --growth-step Grow step in Kb/Mb/Gb/Tb\n"
+ "Predefined complext scenarios/cases:\n"
+ " --case=... Only `basic` scenario implemented for now\n"
+ " basic == Simultaneous multi-process execution\n"
+ " of test-actors: nested,hill,ttl,copy,append,jitter,try\n"
+ "Test actors:\n"
+ " --hill Fill-up and empty-down\n"
+ " by CRUD-operation quads\n"
+ " --ttl Stochastic time-to-live simulation\n"
+ " --nested Nested transactionы\n"
+ " with stochastic-size bellows\n"
+ " --jitter Jitter/delays simulation\n"
+ " --try Try write-transaction, no more\n"
+ " --copy Online copy/backup\n"
+ " --append Append-mode insertions\n"
+ " --dead.reader Dead-reader simulator\n"
+ " --dead.writer Dead-writer simulator\n"
+ "Actor options:\n"
+ " --batch.read=N Read-operations batch size\n"
+ " --batch.write=N Write-operations batch size\n"
+ " --delay=N | --no-delay (no)Delay test-actor before start\n"
+ " --wait4ops=N | --no-wait4ops (no)Wait for previous test-actor\n"
+ " completes # ops before start\n"
+ " --duration=N[s|m|h|d] Define running duration\n"
+ " --nops=N[K|M|G|T] Define number of operations/steps\n"
+ " --inject-writefault[=yes|NO] TBD (see the source code)\n"
+ " --drop[=yes|NO] Drop key-value space/table on "
+ "completion\n"
+ " --ignore-dbfull[=yes|NO] Ignore MDBX_MAP_FULL error\n"
+ " --speculum[=yes|NO] Use internal `speculum` to check "
+ "dataset\n"
+ "Keys and Value:\n"
+ " --keylen.min=N Minimal keys length\n"
+ " --keylen.max=N Miximal keys length\n"
+ " --datalen.min=N Minimal data length\n"
+ " --datalen.max=N Miximal data length\n"
+ " --keygen.width=N TBD (see the source code)\n"
+ " --keygen.mesh=N TBD (see the source code)\n"
+ " --keygen.seed=N TBD (see the source code)\n"
+ " --keygen.split=N TBD (see the source code)\n"
+ " --keygen.rotate=N TBD (see the source code)\n"
+ " --keygen.offset=N TBD (see the source code)\n"
+ " --keygen.case=random Generator case (only `random` for now)\n"
+ "Database operation mode:\n"
+ " --mode={[+-]FLAG}[,[+-]FLAG]...\n"
+ " nosubdir == MDBX_NOSUBDIR\n"
+ " rdonly == MDBX_RDONLY\n"
+ " nometasync == MDBX_NOMETASYNC\n"
+ " lifo == MDBX_LIFORECLAIM\n"
+ " coalesce == MDBX_COALESCE\n"
+ " nosync-safe == MDBX_SAFE_NOSYNC\n"
+ " writemap == MDBX_WRITEMAP\n"
+ " mapasync == MDBX_MAPASYNC\n"
+ " nosync-utterly == MDBX_UTTERLY_NOSYNC\n"
+ " perturb == MDBX_PAGEPERTURB\n"
+ " notls == MDBX_NOTLS\n"
+ " nordahead == MDBX_NORDAHEAD\n"
+ " nomeminit == MDBX_NOMEMINIT\n"
+ "Key-value space/table options:\n"
+ " --table={[+-]FLAG}[,[+-]FLAG]...\n"
+ " key.reverse == MDBX_REVERSEKEY\n"
+ " key.integer == MDBX_INTEGERKEY\n"
+ " data.dups == MDBX_DUPSORT\n"
+ " data.integer == MDBX_INTEGERDUP | MDBX_DUPFIXED | MDBX_DUPSORT\n"
+ " data.fixed == MDBX_DUPFIXED | MDBX_DUPSORT\n"
+ " data.reverse == MDBX_REVERSEDUP | MDBX_DUPSORT\n");
exit(EXIT_FAILURE);
}
@@ -25,17 +116,15 @@ void __noreturn usage(void) {
void actor_params::set_defaults(const std::string &tmpdir) {
pathname_log = "";
loglevel =
-#ifdef NDEBUG
- logging::info;
-#elif defined(_WIN32) || defined(_WIN64)
+#if defined(NDEBUG) || defined(_WIN32) || defined(_WIN64)
logging::verbose;
#else
logging::trace;
#endif
pathname_db = tmpdir + "mdbx-test.db";
- mode_flags = MDBX_NOSUBDIR | MDBX_WRITEMAP | MDBX_MAPASYNC | MDBX_NORDAHEAD |
- MDBX_NOMEMINIT | MDBX_COALESCE | MDBX_LIFORECLAIM;
+ mode_flags = MDBX_NOSUBDIR | MDBX_WRITEMAP | MDBX_MAPASYNC | MDBX_NOMEMINIT |
+ MDBX_COALESCE | MDBX_LIFORECLAIM | MDBX_ACCEDE;
table_flags = MDBX_DUPSORT;
size_lower = -1;
@@ -73,6 +162,7 @@ void actor_params::set_defaults(const std::string &tmpdir) {
drop_table = false;
ignore_dbfull = false;
+ speculum = false;
max_readers = 42;
max_tables = 42;
@@ -82,7 +172,8 @@ void actor_params::set_defaults(const std::string &tmpdir) {
global::config::cleanup_before = true;
global::config::cleanup_after = true;
global::config::failfast = true;
- global::config::progress_indicator = osal_istty(STDERR_FILENO);
+ global::config::progress_indicator = true;
+ global::config::console_mode = osal_istty(STDERR_FILENO);
}
namespace global {
@@ -103,6 +194,7 @@ bool cleanup_before;
bool cleanup_after;
bool failfast;
bool progress_indicator;
+bool console_mode;
} /* namespace config */
} /* namespace global */
@@ -130,7 +222,7 @@ int main(int argc, char *const argv[]) {
#endif /* _DEBUG */
if (argc < 2)
- failure("No parameters given\n");
+ failure("No parameters given. Try --help\n");
if (argc == 2 && strncmp(argv[1], global::thunk_param_prefix,
strlen(global::thunk_param_prefix)) == 0)
@@ -139,6 +231,10 @@ int main(int argc, char *const argv[]) {
? EXIT_SUCCESS
: EXIT_FAILURE;
+ if (argc == 2 &&
+ (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0))
+ usage();
+
actor_params params;
params.set_defaults(osal_tempdir());
global::config::dump_config = true;
@@ -168,8 +264,8 @@ int main(int argc, char *const argv[]) {
}
if (config::parse_option(argc, argv, narg, "pagesize", params.pagesize,
- mdbx_limits_pgsize_min(),
- mdbx_limits_pgsize_max())) {
+ int(mdbx_limits_pgsize_min()),
+ int(mdbx_limits_pgsize_max()))) {
const unsigned keylen_max = params.mdbx_keylen_max();
if (params.keylen_min > keylen_max)
params.keylen_min = keylen_max;
@@ -182,6 +278,17 @@ int main(int argc, char *const argv[]) {
params.datalen_max = datalen_max;
continue;
}
+ if (config::parse_option(argc, argv, narg, "repeat", params.nrepeat,
+ config::no_scale))
+ continue;
+ if (config::parse_option(argc, argv, narg, "threads", params.nthreads,
+ config::no_scale, 1, 64))
+ continue;
+ if (config::parse_option(argc, argv, narg, "timeout",
+ global::config::timeout_duration_seconds,
+ config::duration, 1))
+ continue;
+
if (config::parse_option_intptr(argc, argv, narg, "size-lower",
params.size_lower,
mdbx_limits_dbsize_min(params.pagesize),
@@ -231,17 +338,6 @@ int main(int argc, char *const argv[]) {
keycase_setup(value, params);
continue;
}
-
- if (config::parse_option(argc, argv, narg, "repeat", params.nrepeat,
- config::no_scale))
- continue;
- if (config::parse_option(argc, argv, narg, "threads", params.nthreads,
- config::no_scale, 1, 64))
- continue;
- if (config::parse_option(argc, argv, narg, "timeout",
- global::config::timeout_duration_seconds,
- config::duration, 1))
- continue;
if (config::parse_option(argc, argv, narg, "keylen.min", params.keylen_min,
config::no_scale, params.mdbx_keylen_min(),
params.mdbx_keylen_max())) {
@@ -296,6 +392,8 @@ int main(int argc, char *const argv[]) {
if (config::parse_option(argc, argv, narg, "ignore-dbfull",
params.ignore_dbfull))
continue;
+ if (config::parse_option(argc, argv, narg, "speculum", params.speculum))
+ continue;
if (config::parse_option(argc, argv, narg, "dump-config",
global::config::dump_config))
continue;
@@ -316,7 +414,7 @@ int main(int argc, char *const argv[]) {
params.delaystart = 0;
continue;
}
- if (config::parse_option(argc, argv, narg, "no-wait", nullptr)) {
+ if (config::parse_option(argc, argv, narg, "no-wait4ops", nullptr)) {
params.waitfor_nops = 0;
continue;
}
@@ -346,6 +444,10 @@ int main(int argc, char *const argv[]) {
configure_actor(last_space_id, ac_deadwrite, value, params);
continue;
}
+ if (config::parse_option(argc, argv, narg, "try", nullptr)) {
+ configure_actor(last_space_id, ac_try, value, params);
+ continue;
+ }
if (config::parse_option(argc, argv, narg, "copy", nullptr)) {
configure_actor(last_space_id, ac_copy, value, params);
continue;
@@ -358,17 +460,24 @@ int main(int argc, char *const argv[]) {
configure_actor(last_space_id, ac_ttl, value, params);
continue;
}
+ if (config::parse_option(argc, argv, narg, "nested", nullptr)) {
+ configure_actor(last_space_id, ac_nested, value, params);
+ continue;
+ }
if (config::parse_option(argc, argv, narg, "failfast",
global::config::failfast))
continue;
if (config::parse_option(argc, argv, narg, "progress",
global::config::progress_indicator))
continue;
+ if (config::parse_option(argc, argv, narg, "console",
+ global::config::console_mode))
+ continue;
if (*argv[narg] != '-')
testcase_setup(argv[narg], params, last_space_id);
else
- failure("Unknown option '%s'\n", argv[narg]);
+ failure("Unknown option '%s'. Try --help\n", argv[narg]);
}
if (global::config::dump_config)
@@ -456,8 +565,8 @@ int main(int argc, char *const argv[]) {
if (!actor)
continue;
- log_info("actor #%u, id %d, pid %u: %s\n", actor->actor_id,
- actor->space_id, pid, status2str(status));
+ log_verbose("actor #%u, id %d, pid %ld: %s\n", actor->actor_id,
+ actor->space_id, (long)pid, status2str(status));
if (status > as_running) {
left -= 1;
if (status != as_successful) {
@@ -480,9 +589,37 @@ int main(int argc, char *const argv[]) {
log_notice("RESULT: %s\n", failed ? "Failed" : "Successful");
if (global::config::cleanup_before) {
if (failed)
- log_info("skip cleanup");
+ log_verbose("skip cleanup");
else
cleanup();
}
+
+#if !(defined(_WIN32) || defined(_WIN64))
+ struct rusage spent;
+ if (!getrusage(global::singlemode ? RUSAGE_SELF : RUSAGE_CHILDREN, &spent)) {
+ log_notice("%6s: user %f, system %f", "CPU",
+ spent.ru_utime.tv_sec + spent.ru_utime.tv_usec * 1e-6,
+ spent.ru_stime.tv_sec + spent.ru_stime.tv_usec * 1e-6);
+#if defined(__linux__) || defined(__gnu_linux__) || defined(__FreeBSD__) || \
+ defined(__NetBSD__) || defined(__OpenBSD__) || defined(__BSD__) || \
+ defined(__bsdi__) || defined(__DragonFly__) || defined(__APPLE__) || \
+ defined(__MACH__) || defined(__sun)
+ log_notice("%6s: read %ld, write %ld", "IOPs", spent.ru_inblock,
+ spent.ru_oublock);
+ if (spent.ru_maxrss > 0)
+ log_notice("%6s: %ld Kb", "RAM",
+ spent.ru_maxrss
+#if defined(__sun)
+ * getpagesize() / 1024u
+#elif defined(__APPLE__)
+ / 1024u
+#endif
+ );
+ log_notice("%6s: reclaims %ld, faults %ld, swaps %ld", "Paging",
+ spent.ru_minflt, spent.ru_majflt, spent.ru_nswap);
+#endif /* Linux */
+ }
+#endif /* !Windows */
+
return failed ? EXIT_FAILURE : EXIT_SUCCESS;
}