mdbx: переработка инициализации, проверки и импорта dbi-хендлов в транзакциях.

Ранее инициализация в транзакциях структур данных, связанных с
dbi-хендлами и subDb, выполнялась непосредственно при запуске
транзакций. Что в сценариях с большим кол-вом dbi-дексприторов (например
libfpta) порождало заметные накладные расходы, которые расли линейно от
общего кол-ва открытых subDb, а не от реально используемых в транзакции.
При использовании одной-двух сотен хендлов, при старте каждой транзакции
могли копироваться и/или обнуляться десятки килобайт. Теперь этот
недостаток устранен.

Изменена схема инициализации, валидации и импорта хендлов открытых после
старта транзакции:

1) Инициализация теперь выполняется отложенна, а при старте транзации
   обнуляется только массив с однобайтовыми статустами dbi-хендлов.
   При этом доступнва опция сборки `MDBX_ENABLE_DBI_SPARSE`, при активации
   которой используется битовая карты, что снижает объем инициализации
   при старте транзакции в 8 раз (CHAR_BIT).

2) Переработана валидация dbi-хендлов на входах API, с уменьшением кол-ва
   проверок и ветвлений до теоретического минимума.

3) Переработ импорт dbi-хендов открытых после старта транзакци, теперь
   при этом не захватывается мьютекс.
This commit is contained in:
Леонид Юрьев (Leonid Yuriev)
2023-11-05 22:10:29 +03:00
parent 796e56b9b9
commit e6af7d7c53
9 changed files with 1068 additions and 785 deletions

8
mdbx.h
View File

@@ -1921,7 +1921,7 @@ enum MDBX_error_t {
MDBX_TOO_LARGE = -30417,
/** A thread has attempted to use a not owned object,
* e.g. a transaction that started by another thread. */
* e.g. a transaction that started by another thread */
MDBX_THREAD_MISMATCH = -30416,
/** Overlapping read and write transactions for the current thread */
@@ -1936,8 +1936,12 @@ enum MDBX_error_t {
/** Alternative/Duplicate LCK-file is exists and should be removed manually */
MDBX_DUPLICATED_CLK = -30413,
/** Some cursors and/or other resources should be closed before subDb or
* corresponding DBI-handle could be (re)used */
MDBX_DANGLING_DBI = -30412,
/* The last of MDBX-added error codes */
MDBX_LAST_ADDED_ERRCODE = MDBX_DUPLICATED_CLK,
MDBX_LAST_ADDED_ERRCODE = MDBX_DANGLING_DBI,
#if defined(_WIN32) || defined(_WIN64)
MDBX_ENODATA = ERROR_HANDLE_EOF,