/* * Copyright (C) 2021-present ScyllaDB */ /* * SPDX-License-Identifier: AGPL-3.0-or-later */ #include #include #include #include #include #include #include #include #include "utils/logalloc.hh" #include "utils/compact-radix-tree.hh" #include "radix_tree_printer.hh" #include "collection_stress.hh" using namespace compact_radix_tree; using namespace seastar; class test_data { unsigned long *_data; unsigned long _val; public: test_data(unsigned long val) : _data(new unsigned long(val)), _val(val) {} test_data(const test_data&) = delete; test_data(test_data&& o) noexcept : _data(std::exchange(o._data, nullptr)), _val(o._val) {} ~test_data() { if (_data != nullptr) { delete _data; } } unsigned long value() const { return _data == nullptr ? _val + 0x80000000 : *_data; } }; template <> struct fmt::formatter : fmt::formatter { auto format(const test_data& d, fmt::format_context& ctx) const { return fmt::format_to(ctx.out(), "{}", d.value()); } }; using test_tree = tree; int main(int argc, char **argv) { namespace bpo = boost::program_options; app_template app; app.add_options() ("count", bpo::value()->default_value(132564), "number of indices to fill the tree with") ("iters", bpo::value()->default_value(32), "number of iterations") ("verb", bpo::value()->default_value(false), "be verbose"); return app.run(argc, argv, [&app] { auto count = app.configuration()["count"].as(); auto iter = app.configuration()["iters"].as(); auto verb = app.configuration()["verb"].as(); return seastar::async([count, iter, verb] { tree_pointer t; stress_config cfg; cfg.count = count; cfg.iters = 1; cfg.keys = "rand"; cfg.verb = verb; unsigned col_size = 0; for (int i = 0; i < iter; i++) { stress_compact_collection(cfg, /* insert */ [&] (int key) { t->emplace(key, key); col_size++; }, /* erase */ [&] (int key) { t->erase(key); col_size--; }, /* validate */ [&] { if (verb) { compact_radix_tree::printer::show(*t); } unsigned nr = 0; auto ti = t->begin(); while (ti != t->end()) { assert(ti->value() == ti.key()); nr++; ti++; } assert(nr == col_size); }, /* clear */ [&] { t->clear(); col_size = 0; } ); if (cfg.count < 4) { cfg.count = count / 3; } else { cfg.count /= 2; } } }); }); }