mirror of
https://github.com/isar/libmdbx.git
synced 2025-08-23 09:04:26 +08:00
test: add hill testcase.
This commit is contained in:
128
test/config.h
128
test/config.h
@@ -34,6 +34,15 @@ enum actor_status {
|
||||
const char *testcase2str(const actor_testcase);
|
||||
const char *status2str(actor_status status);
|
||||
|
||||
enum keygen_case {
|
||||
kc_random, /* [ 6.. 2.. 7.. 4.. 0.. 1.. 5.. 3.. ] */
|
||||
kc_dashes, /* [ 0123.. 4567.. ] */
|
||||
kc_custom,
|
||||
/* TODO: more cases */
|
||||
};
|
||||
|
||||
const char *keygencase2str(const keygen_case);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
namespace config {
|
||||
@@ -65,17 +74,129 @@ bool parse_option(int argc, char *const argv[], int &narg, const char *option,
|
||||
unsigned &value, const scale_mode scale,
|
||||
const unsigned minval = 0, const unsigned maxval = INT32_MAX);
|
||||
|
||||
bool parse_option(int argc, char *const argv[], int &narg, const char *option,
|
||||
uint8_t &value, const uint8_t minval = 0,
|
||||
const uint8_t maxval = 255);
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
#pragma pack(push, 1)
|
||||
|
||||
struct keygen_params_pod {
|
||||
keygen_case keycase;
|
||||
|
||||
/* Параметры генератора пар key-value.
|
||||
*
|
||||
* Ключи и значения генерируются по задаваемым параметрам на основе "плоской"
|
||||
* исходной координаты. При этом, в общем случае, в процессе тестов исходная
|
||||
* координата последовательно итерируется в заданном диапазоне, а необходимые
|
||||
* паттерны/последовательности/узоры получаются за счет преобразования
|
||||
* исходной координаты, согласно описанным ниже параметрам.
|
||||
*
|
||||
* Стоит отметить, что порядок описания параметров для удобства совпадает с
|
||||
* порядком их использования, т.е. с порядком соответствующих преобразований.
|
||||
*
|
||||
* Второе важное замечание касается ограничений одновременной координированной
|
||||
* генерации паттеров как для ключей, так и для значений. Суть в том, что
|
||||
* такая возможность не нужна по следующим причинам:
|
||||
* - libmdbx поддерживает два существенно различающихся вида таблиц,
|
||||
* "уникальные" (без дубликатов и без multi-value), и так называемые
|
||||
* "с дубликатами" (c multi-value).
|
||||
* - Для таблиц "без дубликатов" только размер связанных к ключами значений
|
||||
* (данных) оказывает влияния на работу движка, непосредственно содержимое
|
||||
* данных не анализируется движком и не оказывает влияния на его работу.
|
||||
* - Для таблиц "с дубликатами", при наличии более одного значения для
|
||||
* некоторого ключа, формируется дочернее btree-поддерево. Это дерево
|
||||
* формируется в отдельном "кусте" страниц и обслуживается независимо
|
||||
* от окружения родительского ключа.
|
||||
* - Таким образом, паттерн генерации значений имеет смысл только для
|
||||
* таблиц "с дубликатами" и только в контексте одного значения ключа.
|
||||
* Иначе говоря, нет смысла в со-координации генерации паттернов для
|
||||
* ключей и значений. Более того, генерацию значений всегда необходимо
|
||||
* рассматривать в контексте связки с одним значением ключа.
|
||||
*
|
||||
* width:
|
||||
* Большинство тестов предполагают создание или итерирование некоторого
|
||||
* количества записей. При этом требуется итерирование или генерация
|
||||
* значений и ключей из некоторого ограниченного пространства вариантов.
|
||||
*
|
||||
* Параметр width задает такую ширину пространства вариантов в битах.
|
||||
* Таким образом мощность пространства вариантов (пока) всегда равна
|
||||
* степени двойки. Это ограничение можно снять, но ценой увеличения
|
||||
* вычислительной сложности, включая потерю простоты и прозрачности.
|
||||
*
|
||||
* С другой стороны, не-битовый width может быть полезен:
|
||||
* - Позволит генерировать ключи/значения в точно задаваемом диапазоне.
|
||||
* Например, перебрать в псевдо-случайном порядке 10001 значение.
|
||||
* - Позволит поровну разделять заданное пространство (диапазон)
|
||||
* ключей/значений между количеством потоков некратным степени двойки.
|
||||
*
|
||||
* mesh и seed:
|
||||
* Позволяют получить псевдо-случайные последовательности ключей/значений.
|
||||
* Параметр mesh задает сколько младших бит исходной плоской координаты
|
||||
* будет "перемешано" (инъективно отображено), а параметр seed позволяет
|
||||
* выбрать конкретный вариант "перемешивания".
|
||||
*
|
||||
* Перемешивание выполняется при ненулевом значении mesh. Перемешивание
|
||||
* реализуется посредством применения двух инъективных функций для
|
||||
* заданного количества бит:
|
||||
* - применяется первая инъективная функция;
|
||||
* - к результату добавляется salt полученный из seed;
|
||||
* - применяется вторая инъективная функция;
|
||||
*
|
||||
* Следует отметить, что mesh умышленно позволяет перемешать только младшую
|
||||
* часть, что при ненулевом значении split (см далее) не позволяет получать
|
||||
* псевдо-случайные значений ключей без псевдо-случайности в значениях.
|
||||
*
|
||||
* Такое ограничение соответствуют внутренней алгоритмике libmdbx. Проще
|
||||
* говоря мы можем проверить движок псевдо-случайной последовательностью
|
||||
* ключей на таблицах без дубликатов (без multi-value), а затем проверить
|
||||
* корректность работу псевдо-случайной последовательностью значений на
|
||||
* таблицах с дубликатами (с multi-value), опционально добавляя
|
||||
* псевдо-случайности к последовательности ключей. Однако, нет смысла
|
||||
* генерировать псевдо-случайные ключи, одновременно с формированием
|
||||
* какого-либо паттерна в значениях, так как содержимое в данных либо
|
||||
* не будет иметь значения (для таблиц без дубликатов), либо будет
|
||||
* обрабатываться в отдельных btree-поддеревьях.
|
||||
*
|
||||
* rotate и offset:
|
||||
* Для проверки слияния и разделения страниц внутри движка требуются
|
||||
* генерация ключей/значений в виде не-смежных последовательностей, как-бы
|
||||
* в виде "пунктира", который постепенно заполняет весь заданных диапазон.
|
||||
*
|
||||
* Параметры позволяют генерировать такой "пунктир". Соответственно rotate
|
||||
* задает циклический сдвиг вправо, а offset задает смещение, точнее говоря
|
||||
* сложение по модулю внутри диапазона заданного посредством width.
|
||||
*
|
||||
* Например, при rotate равном 1 (циклический сдвиг вправо на 1 бит),
|
||||
* четные и нечетные исходные значения сложатся в две линейные
|
||||
* последовательности, которые постепенно закроют старшую и младшую
|
||||
* половины диапазона.
|
||||
*
|
||||
* split:
|
||||
* Для таблиц без дубликатов (без multi-value ключей) фактически требуется
|
||||
* генерация только ключей, а данные могут быть постоянным. Но для таблиц с
|
||||
* дубликатами (с multi-value ключами) также требуется генерация значений.
|
||||
*
|
||||
* Ненулевое значение параметра split фактически включает генерацию значений,
|
||||
* при этом значение split определяет сколько бит исходного абстрактного
|
||||
* номера будет отрезано для генерации значения.
|
||||
*/
|
||||
|
||||
uint8_t width;
|
||||
uint8_t mesh;
|
||||
uint8_t rotate;
|
||||
uint8_t split;
|
||||
uint32_t seed;
|
||||
uint64_t offset;
|
||||
};
|
||||
|
||||
struct actor_params_pod {
|
||||
unsigned loglevel;
|
||||
|
||||
size_t mode_flags;
|
||||
size_t table_flags;
|
||||
uint64_t size;
|
||||
unsigned seed;
|
||||
|
||||
unsigned test_duration;
|
||||
unsigned test_nops;
|
||||
@@ -91,10 +212,11 @@ struct actor_params_pod {
|
||||
unsigned delaystart;
|
||||
unsigned waitfor_nops;
|
||||
|
||||
bool drop_table;
|
||||
|
||||
unsigned max_readers;
|
||||
unsigned max_tables;
|
||||
keygen_params_pod keygen;
|
||||
|
||||
bool drop_table;
|
||||
};
|
||||
|
||||
struct actor_config_pod {
|
||||
|
Reference in New Issue
Block a user