libmdbx 0.12.2 (Иван Ярыгин)
Выпуск с существенными доработками и новой функциональностью в память о российском борце Иване Сергеевиче Ярыгине.
На Олимпийских играх в Мюнхене в 1972 году Иван Ярыгин уложил всех соперников на лопатки, суммарно затратив менее 9 минут. Этот рекорд никем не побит до сих пор.
64 files changed, 5573 insertions(+), 2510 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Новое:
Поддержка всех основных опций при сборке посредством CMake.
Требования к CMake понижены до версии 3.0.2 для возможности сборки для устаревших платформ.
Добавлена возможность профилирования работы GC в сложных и/или нагруженных сценариях (например Ethereum/Erigon). По-умолчанию соответствующий код отключен, а для его активации необходимо указать опцию сборки
MDBX_ENABLE_PROFGC=1
.Добавлена функция
mdbx_env_warmup()
для “прогрева” БД с возможностью закрепления страниц в памяти. В утилитыmdbx_chk
,mdbx_copy
иmdbx_dump
добавлены опции-u
и-U
для активации соответствующего функционала.Отключение учета «грязных» страниц в не требующих этого режимах (
MDBX_WRITEMAP
приMDBX_AVOID_MSYNC=0
). Доработка позволяет снизить накладные расходы и была запланирована давно, но откладывалась так как требовала других изменений.Вытеснение из памяти (спиллинг) «грязных» страниц с учетом размера large/overflow-страниц. Доработка позволяет корректно соблюдать политику задаваемую опциями
MDBX_opt_txn_dp_limit
,MDBX_opt_spill_max_denominator
,MDBX_opt_spill_min_denominator
и была запланирована давно, но откладывалась так как требовала других изменений.Для Windows в API добавлены UNICODE-зависимые определения макросов
MDBX_DATANAME
,MDBX_LOCKNAME
иMDBX_LOCK_SUFFIX
.Переход на преимущественное использование типа
size_t
для уменьшения накладных расходов на платформе Эльбрус.В API добавлены функции
mdbx_limits_valsize4page_max()
иmdbx_env_get_valsize4page_max()
возвращающие максимальный размер в байтах значения, которое может быть размещена в одной large/overflow-странице, а не последовательности из двух или более таких страниц. Для таблиц с поддержкой дубликатов вынос значений на large/overflow-страницы не поддерживается, поэтому результат совпадает сmdbx_limits_valsize_max()
.В API добавлены функции
mdbx_limits_pairsize4page_max()
иmdbx_env_get_pairsize4page_max()
возвращающие в байтах максимальный суммарный размер пары ключ-значение для их размещения на одной листовой страницы, без выноса значения на отдельную large/overflow-страницу. Для таблиц с поддержкой дубликатов вынос значений на large/overflow-страницы не поддерживается, поэтому результат определяет максимальный/допустимый суммарный размер пары ключ-значение.Реализовано использование асинхронной (overlapped) записи в Windows, включая использования небуфферизированного ввода-вывода и
WriteGather()
. Это позволяет сократить накладные расходы и частично обойти проблемы Windows с низкой производительностью ввода-вывода, включая большие задержкиFlushFileBuffers()
. Новый код также обеспечивает консолидацию записываемых регионов на всех платформах, а на Windows использование событий (events) сведено к минимум, одновременно с автоматических использованиемWriteGather()
. Поэтому ожидается существенное снижение накладных расходов взаимодействия с ОС, а в Windows это ускорение, в некоторых сценариях, может быть кратным в сравнении с LMDB.Добавлена опция сборки
MDBX_AVOID_MSYNC
, которая определяет поведение libmdbx в режимеMDBX_WRITE_MAP
(когда данные изменяются непосредственно в отображенных в ОЗУ страницах БД):Если
MDBX_AVOID_MSYNC=0
(по умолчанию на всех системах кроме Windows), то (как прежде) сохранение данных выполняется посредствомmsync()
, либоFlushViewOfFile()
на Windows. На платформах с полноценной подсистемой виртуальной памяти и адекватным файловым вводом-выводом это обеспечивает минимум накладных расходов (один системный вызов) и максимальную производительность. Однако, на Windows приводит к значительной деградации, в том числе из-за того что послеFlushViewOfFile()
требуется также вызовFlushFileBuffers()
с массой проблем и суеты внутри ядра ОС.Если
MDBX_AVOID_MSYNC=1
(по умолчанию только на Windows), то сохранение данных выполняется явной записью в файл каждой измененной страницы БД. Это требует дополнительных накладных расходов, как на отслеживание измененных страниц (ведение списков “грязных” страниц), так и на системные вызовы для их записи. Кроме этого, с точки зрения подсистемы виртуальной памяти ядра ОС, страницы БД измененные в ОЗУ и явно записанные в файл, могут либо оставаться “грязными” и быть повторно записаны ядром ОС позже, либо требовать дополнительных накладных расходов для отслеживания PTE (Page Table Entries), их модификации и дополнительного копирования данных. Тем не менее, по имеющейся информации, на Windows такой путь записи данных в целом обеспечивает более высокую производительность.
Улучшение эвристики включения авто-слияния записей GC.
Изменение формата LCK и семантики некоторых внутренних полей. Версии libmdbx использующие разный формат не смогут работать с одной БД одновременно, а только поочередно (LCK-файл переписывается при открытии первым открывающим БД процессом).
В
C++
API добавлены методы фиксации транзакции с получением информации о задержках.Added
MDBX_HAVE_BUILT IN_CPU_SUPPORTS
build option to control use GCC’s__builtin_cpu_supports()
function, which could be unavailable on a fake OSes (macos, ios, android, etc).
Исправления (без корректировок вышеперечисленных новых функций):
- Устранения ряда предупреждений при сборке посредством MinGW.
- Устранение ложно-положительных сообщений от Valgrind об использовании не инициализированных данных из-за выравнивающих зазоров в
struct troika
. - Исправлен возврат неожиданной ошибки
MDBX_BUSY
из функцийmdbx_env_set_option()
,mdbx_env_set_syncbytes()
иmdbx_env_set_syncperiod()
. - Небольшие исправления для совместимости с CMake 3.8
- Больше контроля и осторожности (паранойи) для страховки от дефектов
mremap()
. - Костыль для починки сборки со старыми версиями
stdatomic.h
из GNU Lib C, где макросыATOMIC_*_LOCK_FREE
ошибочно переопределяются через функции. - Использование
fcntl64(F_GETLK64/F_SETLK64/F_SETLKW64)
при наличии. Это решает проблему срабатывания проверочного утверждения при сборке для платформ где типoff_t
шире соответствующих полейструктуры flock
, используемой для блокировки файлов. - Доработан сбор информации о задержках при фиксации транзакций:
- Устранено искажение замеров длительности обновления GC при включении отладочного внутреннего аудита;
- Защита от undeflow-нуля только общей задержки в метриках, чтобы исключить ситуации, когда сумма отдельных стадий больше общей длительности.
- Ряд исправлений для устранения срабатываний проверочных утверждения в отладочных сборках.
- Более осторожное преобразование к типу
mdbx_tid_t
для устранения предупреждений. - Исправление лишнего сброса данных на диск в режиме
MDBX_SAFE_NOSYNC
при обновлении GC. - Fixed an extra check for
MDBX_APPENDDUP
insidemdbx_cursor_put()
which could result in returningMDBX_EKEYMISMATCH
for valid cases. - Fixed nasty
clz()
bug (by using_BitScanReverse()
, only MSVC builds affected).
Мелочи:
- Исторические ссылки cвязанные с удалённым на
githubпроектом перенаправлены на web.archive.org. - Синхронизированы конструкции CMake между проектами.
- Добавлено предупреждение о небезопасности RISC-V.
- Добавлено описание параметров
MDBX_debug_func
иMDBX_debug_func
. - Добавлено обходное решение для минимизации ложно-положительных конфликтов при использовании файловых блокировок в Windows.
- Проверка атомарности C11-операций c 32/64-битными данными.
- Уменьшение в 42 раза значения по-умолчанию для
me_options.dp_limit
в отладочных сборках. - Добавление платформы
gcc-riscv64-linux-gnu
в список для целиcross-gcc
. - Небольшие правки скрипта
long_stochastic.sh
для работы в Windows. - Удаление ненужного вызова
LockFileEx()
внутриmdbx_env_copy()
. - Добавлено описание использования файловых дескрипторов в различных режимах.
- Добавлено использование
_CrtDbgReport()
в отладочных сборках. - Fixed an extra ensure/assertion check of
oldest_reader
insidetxn_end()
. - Removed description of deprecated usage of
MDBX_NODUPDATA
. - Fixed regression ASAN/Valgring-enabled builds.
- Fixed minor MingGW warning.
Загрузки:
- 269K, libmdbx-amalgamated-0.12.2.zpaq, sha256sum:
eac7ad2f65a33a513d6ed751a89de0f2ed94495745d745d622d5854f7079dae9
- 359K, libmdbx-amalgamated-0.12.2.tar.xz, sha256sum:
76e272b3038eb02d23d5d1f4c04db6d62b323f27fadec2f3da3c7c60ff02247f
- 478K, libmdbx-amalgamated-0.12.2.tar.bz2, sha256sum:
f5ae35f8ba67eaa03a485d6b7225921fe95f1565d599aeccc1708dad8111ff06
- 742K, libmdbx-amalgamated-0.12.2.tar.gz, sha256sum:
7d38ace8a428c32549ee1ea35816a1842c938c39ea481be9d68c1b19e5bd41e2
- 753K, libmdbx-amalgamated-0_12_2.zip, sha256sum:
578c8e90e8f8dc30a5847e700baac7975499ae8eea941f41c4be458909c6a384
За информацией о предыдущих версиях обращайтесь к тегам git и ChangeLog.