diff --git a/ChangeLog.md b/ChangeLog.md index 543b5d83..e9b3696e 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,20 +1,107 @@ ChangeLog --------- -## Underway v0.12.2 +## В разработке v0.12.2 -New: - - 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). +Новое: -Fixes: + - В C++ API добавлены методы фиксации транзакции с получением информации + о задержках. + - Отключение учета «грязных» страниц в не требующих этого режимах + (`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 такой путь + записи данных в целом обеспечивает более высокую производительность. + + - 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). + +Исправления: + + - Доработан сбор информации о задержках при фиксации транзакций: + * Устранено искажение замеров длительности обновления GC + при включении отладочного внутреннего аудита; + * Защита от undeflow-нуля только общей задержки в метриках, + чтобы исключить ситуации, когда сумма отдельных стадий + больше общей длительности. + - Ряд исправлений для устранения срабатываний проверочных утверждения в отладочных сборках. + - Исправление лишнего сброса данных на диск в режиме `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). -Minors: +Мелочи: + - Добавлено описание использования файловых дескрипторов в различных режимах. + - Добавлено использование _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.