summaryrefslogtreecommitdiff
path: root/libs/libmdbx/src/test/ttl.cc
diff options
context:
space:
mode:
authorGeorge Hazan <ghazan@miranda.im>2019-08-28 18:35:09 +0300
committerGeorge Hazan <ghazan@miranda.im>2019-08-28 18:35:09 +0300
commitdc7dfedb811ebac3b078113443da231043bd4b29 (patch)
tree04ba9abd6ba6fe57244f138048833f071f2857c1 /libs/libmdbx/src/test/ttl.cc
parent491d424f91413ca196d0611c36605651b7723433 (diff)
libmdbx: merge with 0.3.2
Diffstat (limited to 'libs/libmdbx/src/test/ttl.cc')
-rw-r--r--libs/libmdbx/src/test/ttl.cc100
1 files changed, 71 insertions, 29 deletions
diff --git a/libs/libmdbx/src/test/ttl.cc b/libs/libmdbx/src/test/ttl.cc
index 1ecfd0c7e5..b2650f0c13 100644
--- a/libs/libmdbx/src/test/ttl.cc
+++ b/libs/libmdbx/src/test/ttl.cc
@@ -29,12 +29,12 @@ static unsigned edge2count(uint64_t edge, unsigned count_max) {
}
bool testcase_ttl::run() {
- db_open();
-
- txn_begin(false);
- MDBX_dbi dbi = db_table_open(true);
- db_table_clear(dbi);
- txn_end(false);
+ MDBX_dbi dbi;
+ int err = db_open__begin__table_create_open_clean(dbi);
+ if (unlikely(err != MDBX_SUCCESS)) {
+ log_notice("ttl: bailout-prepare due '%s'", mdbx_strerror(err));
+ return true;
+ }
/* LY: тест "эмуляцией time-to-live":
* - организуется "скользящее окно", которое двигается вперед вдоль
@@ -53,11 +53,26 @@ bool testcase_ttl::run() {
*/
/* LY: для параметризации используем подходящие параметры, которые не имеют
- * здесь смысла в первоначальном значении */
- const unsigned window_max =
- (config.params.batch_read > 999) ? config.params.batch_read : 1000;
- const unsigned count_max =
- (config.params.batch_write > 999) ? config.params.batch_write : 1000;
+ * здесь смысла в первоначальном значении. */
+ const unsigned window_max_lower =
+#ifdef __APPLE__
+ 333;
+#else
+ 999;
+#endif
+ const unsigned count_max_lower =
+#ifdef __APPLE__
+ 333;
+#else
+ 999;
+#endif
+
+ const unsigned window_max = (config.params.batch_read > window_max_lower)
+ ? config.params.batch_read
+ : window_max_lower;
+ const unsigned count_max = (config.params.batch_write > count_max_lower)
+ ? config.params.batch_write
+ : count_max_lower;
log_info("ttl: using `batch_read` value %u for window_max", window_max);
log_info("ttl: using `batch_write` value %u for count_max", count_max);
@@ -73,15 +88,13 @@ bool testcase_ttl::run() {
std::deque<std::pair<uint64_t, unsigned>> fifo;
uint64_t serial = 0;
while (should_continue()) {
- if (!txn_guard)
- txn_begin(false);
const uint64_t salt = prng64_white(seed) /* mdbx_txn_id(txn_guard.get()) */;
const unsigned window_width = edge2window(salt, window_max);
- const unsigned head_count = edge2count(salt, count_max);
- log_info("ttl: step #%zu (serial %" PRIu64
- ", window %u, count %u) salt %" PRIu64,
- nops_completed, serial, window_width, head_count, salt);
+ unsigned head_count = edge2count(salt, count_max);
+ log_verbose("ttl: step #%zu (serial %" PRIu64
+ ", window %u, count %u) salt %" PRIu64,
+ nops_completed, serial, window_width, head_count, salt);
if (window_width) {
while (fifo.size() > window_width) {
@@ -93,9 +106,14 @@ bool testcase_ttl::run() {
for (unsigned n = 0; n < tail_count; ++n) {
log_trace("ttl: remove-tail %" PRIu64, serial);
generate_pair(tail_serial);
- int err = mdbx_del(txn_guard.get(), dbi, &key->value, &data->value);
- if (unlikely(err != MDBX_SUCCESS))
+ err = mdbx_del(txn_guard.get(), dbi, &key->value, &data->value);
+ if (unlikely(err != MDBX_SUCCESS)) {
+ if (err == MDBX_MAP_FULL && config.params.ignore_dbfull) {
+ log_notice("ttl: tail-bailout due '%s'", mdbx_strerror(err));
+ goto bailout;
+ }
failure_perror("mdbx_del(tail)", err);
+ }
if (unlikely(!keyvalue_maker.increment(tail_serial, 1)))
failure("ttl: unexpected key-space overflow on the tail");
}
@@ -106,30 +124,54 @@ bool testcase_ttl::run() {
fifo.clear();
}
- txn_restart(false, false);
+ err = breakable_restart();
+ if (unlikely(err != MDBX_SUCCESS)) {
+ log_notice("ttl: bailout at commit due '%s'", mdbx_strerror(err));
+ break;
+ }
fifo.push_front(std::make_pair(serial, head_count));
-
+ retry:
for (unsigned n = 0; n < head_count; ++n) {
log_trace("ttl: insert-head %" PRIu64, serial);
generate_pair(serial);
- int err = mdbx_put(txn_guard.get(), dbi, &key->value, &data->value,
- insert_flags);
- if (unlikely(err != MDBX_SUCCESS))
+ err = mdbx_put(txn_guard.get(), dbi, &key->value, &data->value,
+ insert_flags);
+ if (unlikely(err != MDBX_SUCCESS)) {
+ if (err == MDBX_MAP_FULL && config.params.ignore_dbfull) {
+ log_notice("ttl: head-insert skip due '%s'", mdbx_strerror(err));
+ txn_restart(true, false);
+ serial = fifo.front().first;
+ fifo.front().second = head_count = n;
+ goto retry;
+ }
failure_perror("mdbx_put(head)", err);
+ }
- if (unlikely(!keyvalue_maker.increment(serial, 1)))
- failure("uphill: unexpected key-space overflow");
+ if (unlikely(!keyvalue_maker.increment(serial, 1))) {
+ log_notice("ttl: unexpected key-space overflow");
+ goto bailout;
+ }
+ }
+ err = breakable_restart();
+ if (unlikely(err != MDBX_SUCCESS)) {
+ log_notice("ttl: head-commit skip due '%s'", mdbx_strerror(err));
+ serial = fifo.front().first;
+ fifo.pop_front();
}
-
- txn_end(false);
report(1);
}
+bailout:
+ txn_end(true);
if (dbi) {
if (config.params.drop_table && !mode_readonly()) {
txn_begin(false);
db_table_drop(dbi);
- txn_end(false);
+ err = breakable_commit();
+ if (unlikely(err != MDBX_SUCCESS)) {
+ log_notice("ttl: bailout-clean due '%s'", mdbx_strerror(err));
+ return true;
+ }
} else
db_table_close(dbi);
}