diff options
Diffstat (limited to 'libs/libmdbx/src/test/config.h')
-rw-r--r-- | libs/libmdbx/src/test/config.h | 118 |
1 files changed, 64 insertions, 54 deletions
diff --git a/libs/libmdbx/src/test/config.h b/libs/libmdbx/src/test/config.h index 7efd09dd54..2ab4742a2e 100644 --- a/libs/libmdbx/src/test/config.h +++ b/libs/libmdbx/src/test/config.h @@ -124,7 +124,8 @@ inline bool parse_option_intptr(int argc, char *const argv[], int &narg, #pragma pack(push, 1) struct keygen_params_pod { - /* Параметры генератора пар key-value. + /* Параметры генератора пар key-value. Также может быть полезным описание + * алгоритма генерации в keygen.h * * Ключи и значения генерируются по задаваемым параметрам на основе "плоской" * исходной координаты. При этом, в общем случае, в процессе тестов исходная @@ -141,20 +142,20 @@ struct keygen_params_pod { * - libmdbx поддерживает два существенно различающихся вида таблиц, * "уникальные" (без дубликатов и без multi-value), и так называемые * "с дубликатами" (c multi-value). - * - Для таблиц "без дубликатов" только размер связанных к ключами значений + * - Для таблиц "без дубликатов" только размер связанных с ключами значений * (данных) оказывает влияния на работу движка, непосредственно содержимое * данных не анализируется движком и не оказывает влияния на его работу. * - Для таблиц "с дубликатами", при наличии более одного значения для * некоторого ключа, формируется дочернее btree-поддерево. Это дерево - * формируется в отдельном "кусте" страниц и обслуживается независимо - * от окружения родительского ключа. + * формируется во вложенной странице или отдельном "кусте" страниц, + * и обслуживается независимо от окружения родительского ключа. * - Таким образом, паттерн генерации значений имеет смысл только для * таблиц "с дубликатами" и только в контексте одного значения ключа. - * Иначе говоря, нет смысла в со-координации генерации паттернов для - * ключей и значений. Более того, генерацию значений всегда необходимо - * рассматривать в контексте связки с одним значением ключа. - * - Тем не менее, во всех случаях достаточно важным является равномерная - * всех возможных сочетаний длин ключей и данных. + * Иначе говоря, не имеет смысла взаимная координация при генерации + * значений для разных ключей. Поэтому генерацию значений следует + * рассматривать только в контексте связки с одним значением ключа. + * - Тем не менее, во всех случаях достаточно важным является равновероятное + * распределение всех возможных сочетаний длин ключей и данных. * * width: * Большинство тестов предполагают создание или итерирование некоторого @@ -166,7 +167,7 @@ struct keygen_params_pod { * степени двойки. Это ограничение можно снять, но ценой увеличения * вычислительной сложности, включая потерю простоты и прозрачности. * - * С другой стороны, не-битовый width может быть полезен: + * С другой стороны, не-n-битовый width может быть полезен: * - Позволит генерировать ключи/значения в точно задаваемом диапазоне. * Например, перебрать в псевдо-случайном порядке 10001 значение. * - Позволит поровну разделять заданное пространство (диапазон) @@ -203,7 +204,7 @@ struct keygen_params_pod { * rotate и offset: * Для проверки слияния и разделения страниц внутри движка требуются * генерация ключей/значений в виде не-смежных последовательностей, как-бы - * в виде "пунктира", который постепенно заполняет весь заданных диапазон. + * в виде "пунктира", который постепенно заполняет весь заданный диапазон. * * Параметры позволяют генерировать такой "пунктир". Соответственно rotate * задает циклический сдвиг вправо, а offset задает смещение, точнее говоря @@ -224,55 +225,62 @@ struct keygen_params_pod { * номера будет отрезано для генерации значения. */ - uint8_t width; - uint8_t mesh; - uint8_t rotate; - uint8_t split; - uint32_t seed; - uint64_t offset; - keygen_case keycase; + uint8_t width{0}; + uint8_t mesh{0}; + uint8_t rotate{0}; + uint8_t split{0}; + uint32_t seed{0}; + uint64_t offset{0}; + keygen_case keycase{kc_random}; + bool zero_fill{false}; }; struct actor_params_pod { - unsigned mode_flags; - unsigned table_flags; - intptr_t size_lower; - intptr_t size_now; - intptr_t size_upper; - int shrink_threshold; - int growth_step; - int pagesize; - - unsigned test_duration; - unsigned test_nops; - unsigned nrepeat; - unsigned nthreads; - - unsigned keylen_min, keylen_max; - unsigned datalen_min, datalen_max; - - unsigned batch_read; - unsigned batch_write; - - unsigned delaystart; - unsigned waitfor_nops; - unsigned inject_writefaultn; - - unsigned max_readers; - unsigned max_tables; + unsigned mode_flags{0}; + unsigned table_flags{0}; + intptr_t size_lower{0}; + intptr_t size_now{0}; + intptr_t size_upper{0}; + int shrink_threshold{0}; + int growth_step{0}; + int pagesize{0}; + + unsigned test_duration{0}; + unsigned test_nops{0}; + unsigned nrepeat{0}; + unsigned nthreads{0}; + + unsigned keylen_min{0}, keylen_max{0}; + unsigned datalen_min{0}, datalen_max{0}; + + unsigned batch_read{0}; + unsigned batch_write{0}; + + unsigned delaystart{0}; + unsigned waitfor_nops{0}; + unsigned inject_writefaultn{0}; + + unsigned max_readers{0}; + unsigned max_tables{0}; keygen_params_pod keygen; - uint8_t loglevel; - bool drop_table; - bool ignore_dbfull; - bool speculum; + uint8_t loglevel{0}; + bool drop_table{0}; + bool ignore_dbfull{0}; + bool speculum{0}; }; struct actor_config_pod { - unsigned actor_id, space_id; - actor_testcase testcase; - unsigned wait4id; - unsigned signal_nops; + unsigned actor_id{0}, space_id{0}; + actor_testcase testcase{ac_none}; + unsigned wait4id{0}; + unsigned signal_nops{0}; + + actor_config_pod() = default; + actor_config_pod(unsigned actor_id, actor_testcase testcase, + unsigned space_id, unsigned wait4id) + : actor_id(actor_id), space_id(space_id), testcase(testcase), + wait4id(wait4id) {} }; #pragma pack(pop) @@ -286,8 +294,9 @@ void dump(const char *title = "config-dump: "); struct actor_params : public config::actor_params_pod { std::string pathname_log; std::string pathname_db; - void set_defaults(const std::string &tmpdir); + actor_params() = default; + void set_defaults(const std::string &tmpdir); unsigned mdbx_keylen_min() const; unsigned mdbx_keylen_max() const; unsigned mdbx_datalen_min() const; @@ -299,10 +308,11 @@ struct actor_config : public config::actor_config_pod { bool wanna_event4signalling() const { return true /* TODO ? */; } + actor_config() = default; actor_config(actor_testcase testcase, const actor_params ¶ms, unsigned space_id, unsigned wait4id); - actor_config(const char *str) { + actor_config(const char *str) : actor_config() { if (!deserialize(str, *this)) failure("Invalid internal parameter '%s'\n", str); } |