From cd0ed2f155cf76f2973bcac29ab3637c368937d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= Date: Sat, 10 Dec 2022 01:20:27 +0300 Subject: [PATCH] =?UTF-8?q?mdbx:=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20ChangeLog.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ChangeLog.md | 76 +++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index 3aa0f7ee..70d2b89d 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -4,7 +4,15 @@ ChangeLog English version [by Google](https://gitflic-ru.translate.goog/project/erthink/libmdbx/blob?file=ChangeLog.md&_x_tr_sl=ru&_x_tr_tl=en) and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic.ru/project/erthink/libmdbx/blob?file=ChangeLog.md). -## v0.12.3 (Акула) в процессе подготовки + +## v0.12.3 (Акула) запланирован на 2022-12-11 + +Выпуск с существенными доработками и новой функциональностью в память о закрытом open-source проекте "Акула". + +``` +18 files changed, 2470 insertions(+), 1562 deletions(-) +Signed-off-by: Леонид Юрьев (Leonid Yuriev) +``` Благодарности: @@ -13,17 +21,76 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic Новое: - - Использование адреса https://libmdbx.dqdkfa.ru/dead-github для отсылки к сохранённым в web.archive.org копиям ресурсов, уничтоженных администрацией Github. + - Использование адреса [https://libmdbx.dqdkfa.ru/dead-github](https://libmdbx.dqdkfa.ru/dead-github) + для отсылки к сохранённым в web.archive.org копиям ресурсов, уничтоженных администрацией Github. + + - Реализована prefault-запись при выделении страниц для read-write отображений. + Это приводит к кратному снижению системных издержек и существенному увеличению + производительности в соответствующих сценариях использования, когда: + - размер БД и объём данных существенно больше ОЗУ; + - используется режим `MDBX_WRITEMAP`; + - не-мелкие транзакции (по ходу транзакции выделяется многие сотни или тысячи страниц). + + В режиме `MDBX_WRITEMAP` выделение/переиспользование страниц приводит + к page-fault и чтению страницы с диска, даже если содержимое страницы + не нужно (будет перезаписано). Это является следствием работы подсистемы + виртуальной памяти, а штатный способ лечения через `MADV_REMOVE` + работает не на всех ФС и обычно дороже получаемой экономии. + + Теперь в libmdbx используется "упреждающая запись" таких страниц, + которая на системах с [unified page cache](https://www.opennet.ru/base/dev/ubc.txt.html) + приводит к "вталкиванию" данных, устраняя необходимость чтения с диска при + обращении к такой странице памяти. + + Новый функционал работает в согласованности с автоматическим управлением read-ahead + и кэшем статуса присутствия страниц в ОЗУ, посредством [mincore()](https://man7.org/linux/man-pages/man2/mincore.2.html). + + - Реализован динамический выбор между сквозной записью на диск и обычной записью + с последующим [fdatasync()](https://man7.org/linux/man-pages/man3/fdatasync.3p.html) + управляемый опцией `MDBX_opt_writethrough_threshold`. + + В долговечных (durable) режимах данные на диск могут быть сброшены двумя способами: + - сквозной записью через файловый дескриптор открытый с `O_DSYNC`; + - обычной записью с последующим вызовом `fdatasync()`. + + Первый способ выгоднее при записи малого количества страниц и/или если + канал взаимодействия с диском/носителем имеет близкую к нулю задержку. + Второй способ выгоднее если требуется записать много страниц и/или канал + взаимодействия имеет весомую задержку (датацентры, облака). Добавленная + опция `MDBX_opt_writethrough_threshold` позволяет во время выполнения + задать порог для динамического выбора способа записи в зависимост от + объема и конкретных условия использования. + + - Автоматическая установка `MDBX_opt_rp_augment_limit` в зависимости от размера БД. + + - Запрещение разного режима `MDBX_WRITEMAP` между процессами в режимах + с отложенной/ленивой записью, так как в этом случае невозможно + обеспечить сброс данных на диск во всех случаях на всех поддерживаемых платформах. Исправления (без корректировок новых функций): - - Устранение SIGSEGV или ошибочного вызова `free()` в ситуациях повторного открытия среды посредством `mdbx_env_open()`. + - Изменение размера отображения если это требуется для сброса данных на + диск при вызове `mdbx_env_sync()` из параллельного потока выполнения вне + работающей транзакции. + + - Исправление регресса после коммита db72763de049d6e4546f838277fe83b9081ad1de от 2022-10-08 + в логике возврата грязных страниц в режиме `MDBX_WRITEMAP`, из-за чего + освободившиеся страницы использовались не немедленно, а попадали в + retired-список совершаемой транзакции и происходил необоснованный рост + размера транзакции. + + - Устранение SIGSEGV или ошибочного вызова `free()` в ситуациях + повторного открытия среды посредством `mdbx_env_open()`. + - Устранение ошибки совершенной в коммите fe20de136c22ed3bc4c6d3f673e79c106e824f60 от 2022-09-18, в результате чего на Linux в режиме `MDBX_WRITEMAP` никогда не вызывался `msync()`. Проблема существует только в релизе 0.12.2. + - Добавление подсчета грязных страниц в `MDBX_WRITEMAP` для предоставления посредством `mdbx_txn_info()` актуальной информации об объеме изменений в процессе транзакций чтения-записи. + - Исправление несущественной опечатки в условиях `#if` определения порядка байт. + - Исправление сборки для случая `MDBX_PNL_ASCENDING=1`. Ликвидация технических долгов и мелочи: @@ -32,6 +99,9 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/gitflic - Устранение несущественных предупреждений Coverity. - Использование единого курсора для поиска в GC. - Переработка внутренних флагов связанных с выделением страниц из GC. + - Доработка подготовки резерва перед обновлением GC при включенном BigFoot. + - Оптимизация `pnl_merge()` для случаев неперекрывающихся объединяемых списков. + - Оптимизация поддержки отсортированного списка страниц в `dpl_append()`. -------------------------------------------------------------------------------