From d63c2484fe90ed613a6fe1cfb52d3933347a2f7d Mon Sep 17 00:00:00 2001 From: Leo Yuriev Date: Mon, 19 Mar 2018 16:51:44 +0300 Subject: [PATCH] mdbx-tests: add --inject-writefault=N option. --- test/config.cc | 5 +++++ test/config.h | 1 + test/main.cc | 3 +++ test/test.cc | 22 ++++++++++++++++++++++ test/test.h | 2 ++ 5 files changed, 33 insertions(+) diff --git a/test/config.cc b/test/config.cc index 2b9c6e5a..124a517f 100644 --- a/test/config.cc +++ b/test/config.cc @@ -326,6 +326,11 @@ void dump(const char *title) { else log_info("no-delay\n"); + if (i->params.inject_writefaultn) + log_info("inject-writefault on %u ops\n", i->params.inject_writefaultn); + else + log_info("no-inject-writefault\n"); + log_info("limits: readers %u, tables %u\n", i->params.max_readers, i->params.max_tables); diff --git a/test/config.h b/test/config.h index 5efd3110..8b5c0e3d 100644 --- a/test/config.h +++ b/test/config.h @@ -218,6 +218,7 @@ struct actor_params_pod { unsigned delaystart; unsigned waitfor_nops; + unsigned inject_writefaultn; unsigned max_readers; unsigned max_tables; diff --git a/test/main.cc b/test/main.cc index adf60aae..70a67e3d 100644 --- a/test/main.cc +++ b/test/main.cc @@ -219,6 +219,9 @@ int main(int argc, char *const argv[]) { if (config::parse_option(argc, argv, narg, "wait4ops", params.waitfor_nops, config::decimal)) continue; + if (config::parse_option(argc, argv, narg, "inject-writefault", + params.inject_writefaultn, config::decimal)) + continue; if (config::parse_option(argc, argv, narg, "drop", params.drop_table)) continue; if (config::parse_option(argc, argv, narg, "dump-config", diff --git a/test/test.cc b/test/test.cc index 8700d74a..3987c63c 100644 --- a/test/test.cc +++ b/test/test.cc @@ -204,6 +204,7 @@ void testcase::txn_end(bool abort) { if (unlikely(rc != MDBX_SUCCESS)) failure_perror("mdbx_txn_abort()", rc); } else { + txn_inject_writefault(txn); int rc = mdbx_txn_commit(txn); if (unlikely(rc != MDBX_SUCCESS)) failure_perror("mdbx_txn_commit()", rc); @@ -218,6 +219,27 @@ void testcase::txn_restart(bool abort, bool readonly, unsigned flags) { txn_begin(readonly, flags); } +void testcase::txn_inject_writefault(void) { + if (txn_guard) + txn_inject_writefault(txn_guard.get()); +} + +void testcase::txn_inject_writefault(MDBX_txn *txn) { + if (config.params.inject_writefaultn && txn) { + if (config.params.inject_writefaultn <= nops_completed && + (mdbx_txn_flags(txn) & MDBX_RDONLY) == 0) { + log_info("== txn_inject_writefault(): got %u nops or more, inject FAULT", + config.params.inject_writefaultn); + log_flush(); +#if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS) + TerminateProcess(GetCurrentProcess(), 42); +#else + raise(SIGKILL); +#endif + } + } +} + bool testcase::wait4start() { if (config.wait4id) { log_trace(">> wait4start(%u)", config.wait4id); diff --git a/test/test.h b/test/test.h index 4158aba4..ef1c4caa 100644 --- a/test/test.h +++ b/test/test.h @@ -107,6 +107,8 @@ protected: void txn_begin(bool readonly, unsigned flags = 0); void txn_end(bool abort); void txn_restart(bool abort, bool readonly, unsigned flags = 0); + void txn_inject_writefault(void); + void txn_inject_writefault(MDBX_txn *txn); void fetch_canary(); void update_canary(uint64_t increment); void kick_progress(bool active) const;