summaryrefslogtreecommitdiff
path: root/libs/libmdbx/src/test/config.h
diff options
context:
space:
mode:
Diffstat (limited to 'libs/libmdbx/src/test/config.h')
-rw-r--r--libs/libmdbx/src/test/config.h118
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 &params,
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);
}