diff options
author | George Hazan <ghazan@miranda.im> | 2018-09-17 21:21:41 +0300 |
---|---|---|
committer | George Hazan <ghazan@miranda.im> | 2018-09-17 21:21:49 +0300 |
commit | d6edbc9108a3ea183774c84993f679e824ad8a6f (patch) | |
tree | 8c00b848a3e72b502493648d7eaaa05f68addd87 /libs/libmdbx/src/test | |
parent | dcc57d5f94f77ed22127cbe3ac2babcf2dd6d4e3 (diff) |
libmdbx: another important bugfix
Diffstat (limited to 'libs/libmdbx/src/test')
-rw-r--r-- | libs/libmdbx/src/test/gc.sh | 30 | ||||
-rw-r--r-- | libs/libmdbx/src/test/hill.cc | 7 | ||||
-rw-r--r-- | libs/libmdbx/src/test/jitter.cc | 6 | ||||
-rw-r--r-- | libs/libmdbx/src/test/keygen.cc | 4 | ||||
-rw-r--r-- | libs/libmdbx/src/test/keygen.h | 3 | ||||
-rw-r--r-- | libs/libmdbx/src/test/main.cc | 8 | ||||
-rw-r--r-- | libs/libmdbx/src/test/osal-unix.cc | 14 | ||||
-rw-r--r-- | libs/libmdbx/src/test/test.cc | 10 | ||||
-rw-r--r-- | libs/libmdbx/src/test/test.h | 2 | ||||
-rw-r--r-- | libs/libmdbx/src/test/utils.cc | 5 | ||||
-rw-r--r-- | libs/libmdbx/src/test/utils.h | 2 |
11 files changed, 73 insertions, 18 deletions
diff --git a/libs/libmdbx/src/test/gc.sh b/libs/libmdbx/src/test/gc.sh index bddd92af24..0625518a4f 100644 --- a/libs/libmdbx/src/test/gc.sh +++ b/libs/libmdbx/src/test/gc.sh @@ -32,31 +32,31 @@ function probe { caption="Failfast #1" probe \ --pagesize=min --size=6G --table=+data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max \ - --nops=99999 --batch.write=9 --mode=-writemap,-coalesce,+lifo --keygen.seed=248240655 --hill + --nops=99999 --batch.write=9 --mode=-writemap,-coalesce,+lifo --keygen.seed=248240655 basic caption="Failfast #2" probe \ --pagesize=min --size=6G --table=-data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 \ - --nops=999999 --batch.write=999 --mode=+writemap,+coalesce,+lifo --keygen.seed=259083046 --hill + --nops=999999 --batch.write=999 --mode=+writemap,+coalesce,+lifo --keygen.seed=259083046 basic caption="Failfast #3" probe \ --pagesize=min --size=6G --table=-data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 \ - --nops=999999 --batch.write=999 --mode=+writemap,+coalesce,+lifo --keygen.seed=522365681 --hill + --nops=999999 --batch.write=999 --mode=+writemap,+coalesce,+lifo --keygen.seed=522365681 basic caption="Failfast #4" probe \ --pagesize=min --size=6G --table=-data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 \ - --nops=999999 --batch.write=9999 --mode=-writemap,+coalesce,+lifo --keygen.seed=866083781 --hill + --nops=999999 --batch.write=9999 --mode=-writemap,+coalesce,+lifo --keygen.seed=866083781 basic caption="Failfast #5" probe \ --pagesize=min --size=6G --table=-data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 \ - --nops=999999 --batch.write=999 --mode=+writemap,-coalesce,+lifo --keygen.seed=246539192 --hill + --nops=999999 --batch.write=999 --mode=+writemap,-coalesce,+lifo --keygen.seed=246539192 basic caption="Failfast #6" probe \ --pagesize=min --size=6G --table=-data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 \ - --nops=999999 --batch.write=999 --mode=+writemap,+coalesce,+lifo --keygen.seed=540406278 --hill + --nops=999999 --batch.write=999 --mode=+writemap,+coalesce,+lifo --keygen.seed=540406278 basic caption="Failfast #7" probe \ --pagesize=min --size=6G --table=+data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max \ - --nops=999999 --batch.write=999 --mode=-writemap,+coalesce,+lifo --keygen.seed=619798690 --hill + --nops=999999 --batch.write=999 --mode=-writemap,+coalesce,+lifo --keygen.seed=619798690 basic count=0 for nops in {2..7}; do @@ -65,14 +65,26 @@ for nops in {2..7}; do for ((rep=0; rep++ < loops; )); do for ((bits=2**${#options[@]}; --bits >= 0; )); do seed=$(date +%N) + caption="Probe #$((++count)) int-key,w/o-dups, repeat ${rep} of ${loops}" probe \ + --pagesize=min --size=6G --table=+key.integer,-data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 \ + --nops=$( rep9 $nops ) --batch.write=$( rep9 $wbatch ) --mode=$(bits2list options $bits) \ + --keygen.seed=${seed} basic + caption="Probe #$((++count)) int-key,with-dups, repeat ${rep} of ${loops}" probe \ + --pagesize=min --size=6G --table=+key.integer,+data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max \ + --nops=$( rep9 $nops ) --batch.write=$( rep9 $wbatch ) --mode=$(bits2list options $bits) \ + --keygen.seed=${seed} basic + caption="Probe #$((++count)) int-key,int-data, repeat ${rep} of ${loops}" probe \ + --pagesize=min --size=6G --table=+key.integer,+data.integer --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max \ + --nops=$( rep9 $nops ) --batch.write=$( rep9 $wbatch ) --mode=$(bits2list options $bits) \ + --keygen.seed=${seed} basic caption="Probe #$((++count)) w/o-dups, repeat ${rep} of ${loops}" probe \ --pagesize=min --size=6G --table=-data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=1111 \ --nops=$( rep9 $nops ) --batch.write=$( rep9 $wbatch ) --mode=$(bits2list options $bits) \ - --keygen.seed=${seed} --hill + --keygen.seed=${seed} basic caption="Probe #$((++count)) with-dups, repeat ${rep} of ${loops}" probe \ --pagesize=min --size=6G --table=+data.dups --keylen.min=min --keylen.max=max --datalen.min=min --datalen.max=max \ --nops=$( rep9 $nops ) --batch.write=$( rep9 $wbatch ) --mode=$(bits2list options $bits) \ - --keygen.seed=${seed} --hill + --keygen.seed=${seed} basic done done done diff --git a/libs/libmdbx/src/test/hill.cc b/libs/libmdbx/src/test/hill.cc index 0193c4f2f5..10cb308942 100644 --- a/libs/libmdbx/src/test/hill.cc +++ b/libs/libmdbx/src/test/hill.cc @@ -53,7 +53,7 @@ bool testcase_hill::run() { */ /* TODO: работа в несколько потоков */ - keyvalue_maker.setup(config.params, 0 /* thread_number */); + keyvalue_maker.setup(config.params, config.actor_id, 0 /* thread_number */); keygen::buffer a_key = keygen::alloc(config.params.keylen_max); keygen::buffer a_data_0 = keygen::alloc(config.params.datalen_max); @@ -114,6 +114,7 @@ bool testcase_hill::run() { log_trace("uphill: update-a (age %" PRIu64 "->0) %" PRIu64, age_shift, a_serial); generate_pair(a_serial, a_key, a_data_0, 0); + checkdata("uphill: update-a", dbi, a_key->value, a_data_1->value); rc = mdbx_replace(txn_guard.get(), dbi, &a_key->value, &a_data_0->value, &a_data_1->value, update_flags); if (unlikely(rc != MDBX_SUCCESS)) @@ -126,6 +127,7 @@ bool testcase_hill::run() { // удаляем вторую запись log_trace("uphill: delete-b %" PRIu64, b_serial); + checkdata("uphill: delete-b", dbi, b_key->value, b_data->value); rc = mdbx_del(txn_guard.get(), dbi, &b_key->value, &b_data->value); if (unlikely(rc != MDBX_SUCCESS)) failure_perror("mdbx_del(b)", rc); @@ -158,6 +160,7 @@ bool testcase_hill::run() { a_serial); generate_pair(a_serial, a_key, a_data_0, 0); generate_pair(a_serial, a_key, a_data_1, age_shift); + checkdata("downhill: update-a", dbi, a_key->value, a_data_0->value); int rc = mdbx_replace(txn_guard.get(), dbi, &a_key->value, &a_data_1->value, &a_data_0->value, update_flags); if (unlikely(rc != MDBX_SUCCESS)) @@ -184,6 +187,7 @@ bool testcase_hill::run() { // удаляем первую запись log_trace("downhill: delete-a (age %" PRIu64 ") %" PRIu64, age_shift, a_serial); + checkdata("downhill: delete-a", dbi, a_key->value, a_data_1->value); rc = mdbx_del(txn_guard.get(), dbi, &a_key->value, &a_data_1->value); if (unlikely(rc != MDBX_SUCCESS)) failure_perror("mdbx_del(a)", rc); @@ -195,6 +199,7 @@ bool testcase_hill::run() { // удаляем вторую запись log_trace("downhill: delete-b %" PRIu64, b_serial); + checkdata("downhill: delete-b", dbi, b_key->value, b_data->value); rc = mdbx_del(txn_guard.get(), dbi, &b_key->value, &b_data->value); if (unlikely(rc != MDBX_SUCCESS)) failure_perror("mdbx_del(b)", rc); diff --git a/libs/libmdbx/src/test/jitter.cc b/libs/libmdbx/src/test/jitter.cc index e7faf2a3f9..2551400443 100644 --- a/libs/libmdbx/src/test/jitter.cc +++ b/libs/libmdbx/src/test/jitter.cc @@ -58,7 +58,11 @@ bool testcase_jitter::run() { jitter_delay(); db_close(); - report(1); + + /* just 'align' nops with other tests with batching */ + const auto batching = + std::max(config.params.batch_read, config.params.batch_write); + report(std::max(1u, batching / 2)); } return true; } diff --git a/libs/libmdbx/src/test/keygen.cc b/libs/libmdbx/src/test/keygen.cc index 0b68194dc1..c7a706065f 100644 --- a/libs/libmdbx/src/test/keygen.cc +++ b/libs/libmdbx/src/test/keygen.cc @@ -142,7 +142,7 @@ void __hot maker::pair(serial_t serial, const buffer &key, buffer &value, } } -void maker::setup(const config::actor_params_pod &actor, +void maker::setup(const config::actor_params_pod &actor, unsigned actor_id, unsigned thread_number) { key_essentials.flags = actor.table_flags & (MDBX_INTEGERKEY | MDBX_REVERSEKEY | MDBX_DUPSORT); @@ -161,7 +161,7 @@ void maker::setup(const config::actor_params_pod &actor, assert(thread_number < 2); (void)thread_number; mapping = actor.keygen; - salt = actor.keygen.seed * UINT64_C(14653293970879851569); + salt = (actor.keygen.seed + actor_id) * UINT64_C(14653293970879851569); // FIXME: TODO base = 0; diff --git a/libs/libmdbx/src/test/keygen.h b/libs/libmdbx/src/test/keygen.h index 449165ae9a..bbd97b29d1 100644 --- a/libs/libmdbx/src/test/keygen.h +++ b/libs/libmdbx/src/test/keygen.h @@ -119,7 +119,8 @@ public: void pair(serial_t serial, const buffer &key, buffer &value, serial_t value_age); - void setup(const config::actor_params_pod &actor, unsigned thread_number); + void setup(const config::actor_params_pod &actor, unsigned actor_id, + unsigned thread_number); bool increment(serial_t &serial, int delta); }; diff --git a/libs/libmdbx/src/test/main.cc b/libs/libmdbx/src/test/main.cc index 7493ab75c3..3384311b3b 100644 --- a/libs/libmdbx/src/test/main.cc +++ b/libs/libmdbx/src/test/main.cc @@ -154,8 +154,14 @@ int main(int argc, char *const argv[]) { config::mode_bits)) continue; if (config::parse_option(argc, argv, narg, "table", params.table_flags, - config::table_bits)) + config::table_bits)) { + if ((params.table_flags & MDBX_DUPFIXED) == 0) + params.table_flags &= ~MDBX_INTEGERDUP; + if ((params.table_flags & MDBX_DUPSORT) == 0) + params.table_flags &= + ~(MDBX_DUPFIXED | MDBX_REVERSEDUP | MDBX_INTEGERDUP); continue; + } if (config::parse_option(argc, argv, narg, "pagesize", params.pagesize, mdbx_limits_pgsize_min(), diff --git a/libs/libmdbx/src/test/osal-unix.cc b/libs/libmdbx/src/test/osal-unix.cc index 8132e267ef..6661ae42c8 100644 --- a/libs/libmdbx/src/test/osal-unix.cc +++ b/libs/libmdbx/src/test/osal-unix.cc @@ -182,6 +182,9 @@ void osal_killall_actors(void) { } int osal_actor_poll(mdbx_pid_t &pid, unsigned timeout) { + struct timespec ts; + ts.tv_nsec = 0; + ts.tv_sec = timeout; retry: int status, options = WNOHANG; #ifdef WUNTRACED @@ -209,9 +212,16 @@ retry: } if (pid == 0) { - if (timeout && sleep(timeout)) + /* child still running */ + if (ts.tv_sec == 0 && ts.tv_nsec == 0) + ts.tv_nsec = 1; + if (nanosleep(&ts, &ts) == 0) { + /* timeout and no signal fomr child */ + pid = 0; + return 0; + } + if (errno == EINTR) goto retry; - return 0; } switch (errno) { diff --git a/libs/libmdbx/src/test/test.cc b/libs/libmdbx/src/test/test.cc index c28bbd221e..b9663c2a09 100644 --- a/libs/libmdbx/src/test/test.cc +++ b/libs/libmdbx/src/test/test.cc @@ -410,6 +410,16 @@ void testcase::db_table_close(MDBX_dbi handle) { log_trace("<< testcase::db_table_close"); } +void testcase::checkdata(const char *step, MDBX_dbi handle, MDBX_val key2check, + MDBX_val expected_valued) { + MDBX_val actual_value = expected_valued; + int rc = mdbx_get2(txn_guard.get(), handle, &key2check, &actual_value); + if (unlikely(rc != MDBX_SUCCESS)) + failure_perror(step, rc); + if (!is_samedata(&actual_value, &expected_valued)) + failure("%s data mismatch", step); +} + //----------------------------------------------------------------------------- bool test_execute(const actor_config &config) { diff --git a/libs/libmdbx/src/test/test.h b/libs/libmdbx/src/test/test.h index ef1c4caa47..4b10a40fef 100644 --- a/libs/libmdbx/src/test/test.h +++ b/libs/libmdbx/src/test/test.h @@ -112,6 +112,8 @@ protected: void fetch_canary(); void update_canary(uint64_t increment); void kick_progress(bool active) const; + void checkdata(const char *step, MDBX_dbi handle, MDBX_val key2check, + MDBX_val expected_valued); MDBX_dbi db_table_open(bool create); void db_table_drop(MDBX_dbi handle); diff --git a/libs/libmdbx/src/test/utils.cc b/libs/libmdbx/src/test/utils.cc index 53a750e314..5a5290f057 100644 --- a/libs/libmdbx/src/test/utils.cc +++ b/libs/libmdbx/src/test/utils.cc @@ -91,6 +91,11 @@ bool hex2data(const char *hex_begin, const char *hex_end, void *ptr, return true; } +bool is_samedata(const MDBX_val *a, const MDBX_val *b) { + return a->iov_len == b->iov_len && + memcmp(a->iov_base, b->iov_base, a->iov_len) == 0; +} + //----------------------------------------------------------------------------- /* TODO: replace my 'libmera' from t1ha. */ diff --git a/libs/libmdbx/src/test/utils.h b/libs/libmdbx/src/test/utils.h index 5d62909fd5..42d497e86e 100644 --- a/libs/libmdbx/src/test/utils.h +++ b/libs/libmdbx/src/test/utils.h @@ -317,7 +317,7 @@ struct simple_checksum { std::string data2hex(const void *ptr, size_t bytes, simple_checksum &checksum); bool hex2data(const char *hex_begin, const char *hex_end, void *ptr, size_t bytes, simple_checksum &checksum); - +bool is_samedata(const MDBX_val *a, const MDBX_val *b); std::string format(const char *fmt, ...); uint64_t entropy_ticks(void); |