mirror of
https://github.com/isar/libmdbx.git
synced 2025-02-08 05:18:22 +08:00
Выпуск с существенными доработками и новой функциональностью в память о российском борце [Иване Сергеевиче Ярыгине](https://ru.wikipedia.org/wiki/Ярыгин,_Иван_Сергеевич). На Олимпийских играх в Мюнхене в 1972 году Иван Ярыгин уложил всех соперников на лопатки, суммарно затратив менее 9 минут. Этот рекорд никем не побит до сих пор. Новое: ------ - Поддержка всех основных опций при сборке посредством 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` inside `mdbx_cursor_put()` which could result in returning `MDBX_EKEYMISMATCH` for valid cases. - Fixed nasty `clz()` bug (by using `_BitScanReverse()`, only MSVC builds affected). Мелочи: ------- - Исторические ссылки cвязанные с удалённым на ~~github~~ проектом перенаправлены на [web.archive.org](https://web.archive.org/web/https://github.com/erthink/libmdbx). - Синхронизированны конструкции 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` inside `txn_end()`. - Removed description of deprecated usage of `MDBX_NODUPDATA`. - Fixed regression ASAN/Valgring-enabled builds. - Fixed minor MingGW warning. 64 files changed, 5573 insertions(+), 2510 deletions(-) Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
107 lines
3.1 KiB
Groff
107 lines
3.1 KiB
Groff
.\" Copyright 2015-2022 Leonid Yuriev <leo@yuriev.ru>.
|
|
.\" Copying restrictions apply. See COPYRIGHT/LICENSE.
|
|
.TH MDBX_CHK 1 "2022-11-11" "MDBX 0.12.2"
|
|
.SH NAME
|
|
mdbx_chk \- MDBX checking tool
|
|
.SH SYNOPSIS
|
|
.B mdbx_chk
|
|
[\c
|
|
.BR \-V ]
|
|
[\c
|
|
.BR \-v [ v [ v ]]]
|
|
[\c
|
|
.BR \-n ]
|
|
[\c
|
|
.BR \-q ]
|
|
[\c
|
|
.BR \-c ]
|
|
[\c
|
|
.BR \-w ]
|
|
[\c
|
|
.BR \-d ]
|
|
[\c
|
|
.BR \-i ]
|
|
[\c
|
|
.BI \-s \ subdb\fR]
|
|
.BR \ dbpath
|
|
.SH DESCRIPTION
|
|
The
|
|
.B mdbx_chk
|
|
utility intended to check an MDBX database file.
|
|
.SH OPTIONS
|
|
.TP
|
|
.BR \-V
|
|
Write the library version number to the standard output, and exit.
|
|
.TP
|
|
.BR \-v
|
|
Produce verbose output, including summarize space and page usage statistics.
|
|
If \fB\-vv\fP is given, be more verbose, show summarized B-tree info
|
|
and space allocation.
|
|
If \fB\-vvv\fP is given, be more verbose, include summarized statistics
|
|
of leaf B-tree pages.
|
|
If \fB\-vvvv\fP is given, be even more verbose, show info of each page
|
|
during B-tree traversal and basic info of each GC record.
|
|
If \fB\-vvvvv\fP is given, turn maximal verbosity, display the full list
|
|
of page IDs in the GC records and size of each key-value pair of database(s).
|
|
.TP
|
|
.BR \-q
|
|
Be quiet; do not output anything even if an error was detected.
|
|
.TP
|
|
.BR \-c
|
|
Force using cooperative mode while opening environment, i.e. don't try to open
|
|
in exclusive/monopolistic mode. Only exclusive/monopolistic mode allow complete
|
|
check, including full check of all meta-pages and actual size of database file.
|
|
.TP
|
|
.BR \-w
|
|
Open environment in read-write mode and lock for writing while checking.
|
|
This could be impossible if environment already used by another process(s)
|
|
in an incompatible read-write mode. This allow rollback to last steady commit
|
|
(in case environment was not closed properly) and then check transaction IDs
|
|
of meta-pages. Otherwise, without \fB\-w\fP option environment will be
|
|
opened in read-only mode.
|
|
.TP
|
|
.BR \-d
|
|
Disable page-by-page traversal of B-tree. In this case, without B-tree
|
|
traversal, it is unable to check for lost-unused pages nor for double-used
|
|
pages.
|
|
.TP
|
|
.BR \-i
|
|
Ignore wrong order errors, which will likely false-positive if custom
|
|
comparator(s) was used.
|
|
.TP
|
|
.BR \-s \ subdb
|
|
Verify and show info only for a specific subdatabase.
|
|
.TP
|
|
.BR \-0 | \-1 | \-2
|
|
Using specific meta-page 0, or 2 for checking.
|
|
.TP
|
|
.BR \-t
|
|
Turn to a specified meta-page on successful check.
|
|
.TP
|
|
.BR \-T
|
|
Turn to a specified meta-page EVEN ON UNSUCCESSFUL CHECK!
|
|
.TP
|
|
.BR \-u
|
|
Warms up the DB before checking via notifying OS kernel of subsequent access to the database pages.
|
|
.TP
|
|
.BR \-U
|
|
Warms up the DB before checking, notifying the OS kernel of subsequent access to the database pages,
|
|
then forcibly loads ones by sequential access and tries to lock database pages in memory.
|
|
.TP
|
|
.BR \-n
|
|
Open MDBX environment(s) which do not use subdirectories.
|
|
This is legacy option. For now MDBX handles this automatically.
|
|
|
|
.SH DIAGNOSTICS
|
|
Exit status is zero if no errors occur. Errors result in a non-zero exit status
|
|
and a diagnostic message being written to standard error
|
|
if no quiet mode was requested.
|
|
.SH "SEE ALSO"
|
|
.BR mdbx_stat (1),
|
|
.BR mdbx_copy (1),
|
|
.BR mdbx_dump (1),
|
|
.BR mdbx_load (1)
|
|
.BR mdbx_drop (1)
|
|
.SH AUTHOR
|
|
Leonid Yuriev <https://gitflic.ru/user/erthink>
|