3777 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
c01f025bfa mdbx: обновление года на 2023. 2023-01-16 16:32:02 +03:00
Леонид Юрьев (Leonid Yuriev)
a484a1f89b mdbx: рефакторинг dxb_resize() и связанного кода.
В том числе, для устранения срабатывания assert-проверки
`size_bytes == env->me_dxb_mmap.current` в специфических многопоточных
сценариях использования.

Проверка срабатывала только в отладочных сборках, при специфическом
наложении во времени читающей и пишущей транзакции в разных потоках,
одновременно с изменением размера БД.

Кроме срабатывание проверки, каких-либо других последствий не возникало.
2023-01-16 02:20:56 +03:00
Леонид Юрьев (Leonid Yuriev)
0979a93a78 mdbx: добавлено примечание об ошибке MinGW MSYS2. 2023-01-12 17:01:27 +03:00
Леонид Юрьев (Leonid Yuriev)
a98c73f4f6 mdbx-cmake: вызов mdbx_chk в режиме чтения-записи для проверки MDBX_EXCLUSIVE в этом режиме. 2023-01-12 17:01:27 +03:00
Leonid Yuriev
9e15bd9b29 mdbx-windows: устранение регресса ERROR_SHARING_VIOLATION в режиме MDBX_EXCLUSIVE.
Спасибо maxc0d3r@protonmail.com за сообщение о проблеме.
2023-01-12 17:01:27 +03:00
Leonid Yuriev
0159f97e94 mdbx: ограничиваем размер отображения при коротком read-only файле.
Цель в предотвращении ошибки ERROR_NOT_ENOUGH_MEMORY в Windows, которая
совсем не информативна для пользователя и возникает в этом случае (когда
файл открыт read-only и короче запрошенного размера).
2023-01-12 01:53:22 +03:00
Леонид Юрьев (Leonid Yuriev)
56050f201f mdbx: обновление ChangeLog. 2023-01-10 15:03:38 +03:00
Леонид Юрьев (Leonid Yuriev)
525c4a55a4 mdbx: fix English typos.
Thanks to Dimitris Apostolou <dimitris.apostolou@icloud.com>
2023-01-10 14:16:08 +03:00
Леонид Юрьев (Leonid Yuriev)
702c67fc38 mdbx-test: доработка append-теста.
- добавлен speculum-контроль;
- с вероятностью 1/8 генерируются не-последовательные/не-упорядоченные ключи для проверки возврата MDBX_EKEYMISMATH;
- игнорирование расхождение хеша последовательности для не-последовательных ключей.
2023-01-09 23:51:34 +03:00
Леонид Юрьев (Leonid Yuriev)
3da23da7b3 mdbx: косметический рефакторинг контроля MDBX_APPEND. 2023-01-09 21:39:42 +03:00
Леонид Юрьев (Leonid Yuriev)
16cda5c2e8 mdbx: исправление опечаток в ChangeLog. 2023-01-08 12:40:44 +03:00
Леонид Юрьев (Leonid Yuriev)
f1fdb88938
mdbx: выпуск v0.12.3 "Акула"
Выпуск с существенными доработками и новой функциональностью в память о закрытом open-source проекте "Акула".

Благодарности:
--------------

 - [Alex Sharov](https://t.me/AskAlexSharov) и команде [Erigon](https://github.com/ledgerwatch/erigon) за тестирование.
 - [Simon Leier](https://t.me/leisim) за сообщение о сбоях и тестирование.

Новое:
------

 - Использование адреса [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).

 - Добавлена опция `MDBX_opt_prefault_write_enable` для возможности принудительного
   включения/выключения prefault-записи.

 - Реализован динамический выбор между сквозной записью на диск и обычной записью
   с последующим [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` между процессами в режимах
   с отложенной/ленивой записью, так как в этом случае невозможно
   обеспечить сброс данных на диск во всех случаях на всех поддерживаемых платформах.

 - Добавлена опция сборки `MDBX_MMAP_USE_MS_ASYNC` позволяющая отключить
   использование системного вызова `msync(MS_ASYNC)`, в использовании
   которого нет необходимости на подавляющем большинстве актуальных ОС.
   По-умолчанию `MDBX_MMAP_USE_MS_ASYNC=0` (выключено) на Linux и других
   системах с unified page cache. Такое поведение (без использования
   `msync(MS_ASYNC)`) соответствует неизменяемой (hardcoded) логике LMDB. В
   результате, в простых/наивных бенчмарках, libmdbx опережает LMDB
   примерна также как при реальном применении.

   На всякий случай стоит еще раз отметить/напомнить, что на Windows
   предположительно libmdbx будет отставать от LMDB в сценариях с
   множеством мелких транзакций, так как libmdbx осознанно использует на
   Windows файловые блокировки, которые медленные (плохо реализованы в ядре
   ОС), но позволяют застраховать пользователей от массы неверных действий
   приводящих к повреждению БД.

 - Поддержка не-печатных имен для subDb.

 - Добавлен явный выбор `tls_model("local-dynamic")` для обзода проблемы
   `relocation R_X86_64_TPOFF32 against FOO cannot be used with -shared`
   из-за ошибки в CLANG приводящей к использованию неверного режима `ls_model`.

 - Изменение тактики слияния страниц при удалении.
   Теперь слияние выполняется преимущественно с уже измененной/грязной страницей.
   Если же справа и слева обе страницы с одинаковым статусом,
   то с наименее заполненной, как прежде. В сценариях с массивным удалением
   это позволяет увеличить производительность до 50%.

 - Добавлен контроль отсутствия LCK-файлов с альтернативным именованием.

Исправления (без корректировок новых функций):
----------------------------------------------

 - Изменение размера отображения если это требуется для сброса данных на
   диск при вызове `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`.

Ликвидация технических долгов и мелочи:
---------------------------------------

 - Доработка поддержки авто-слияния записей GC внутри `page_alloc_slowpath()`.
 - Устранение несущественных предупреждений Coverity.
 - Использование единого курсора для поиска в GC.
 - Переработка внутренних флагов связанных с выделением страниц из GC.
 - Доработка подготовки резерва перед обновлением GC при включенном BigFoot.
 - Оптимизация `pnl_merge()` для случаев неперекрывающихся объединяемых списков.
 - Оптимизация поддержки отсортированного списка страниц в `dpl_append()`.
 - Ускорение работы `mdbx_chk` при обработке пользовательских записей в `@MAIN`.
 - Переработка LRU-отметок для спиллинга.
 - Переработка контроля "некогерентности" Unified page cache для уменьшения накладных расходов.
 - Рефакторинг и микрооптимизация.

20 files changed, 4504 insertions(+), 2924 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
v0.12.3
2023-01-07 00:11:51 +03:00
Леонид Юрьев (Leonid Yuriev)
68a8a15621 mdbx: изменение адреса ioarena. 2023-01-07 00:10:23 +03:00
Леонид Юрьев (Leonid Yuriev)
b86b71a948 mdbx: обновление ChangeLog. 2023-01-07 00:10:23 +03:00
Леонид Юрьев (Leonid Yuriev)
61e77e7b70 mdbx: контроль отсутствия дубликатов LCK-файла с альтернативными именами. 2023-01-07 00:10:23 +03:00
Леонид Юрьев (Leonid Yuriev)
08fb7d5838 mdbx: корректировка отключения MDBX_NOSUBDIR при открытии mdbx.dat без директории. 2023-01-07 00:10:19 +03:00
Леонид Юрьев (Leonid Yuriev)
f2a49b687a mdbx: обновление ChangeLog. 2023-01-04 00:19:48 +03:00
Леонид Юрьев (Leonid Yuriev)
c6b73c8a24 mdbx: добавление me_madv_threshold и рефакторинг/упрощение.
Для уменьшения затрат на MDBX_SHRINK_ALLOWED.
2023-01-03 20:20:03 +03:00
Леонид Юрьев (Leonid Yuriev)
24f2e878c1 mdbx: устранение несущественных предупреждений Valgrind. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
2c8d3e1e12 mdbx: исправление предупреждения UBSAN. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
ab55016599 mdbx: устранение ложного срабатывания assert внутри dpl_reserve(). 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
f0c2927fc7 mdbx: перенос LRU-отметок в теневые страницы по отрицательному смещению.
Это позволяет избавиться от повторного поиска в "гзязном" списке
страниц, уже находящихся в стеке курсора, для обнлвления LRU-отметок.
2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
8519fde741 mdbx: микро-оптимизация cmp_reverse(). 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
bcddeaba9f mdbx: изменение CMP2INT().
Решил вернуться к старому варианту. Вроде-бы все актуальные компиляторы
ведут себя с ним прилично (не хуже), а некоторые лучше.
2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
5317e516d2 mdbx: микро-оптимизация cmp_int(). 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
be05037906 mdbx: перемещение debug/assert-макросов перед атомиками. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
f53dc70038 mdbx: добавление eq_fast() для сравнений на (не)равенство.
Цель в том, чтобы уменьшить кол-во условных и безусловных переходов при
сравнениях равно/неравно, в том числе избегать вызовов задаваемых
кастомных компаратаров и memcmp() для коротких ключей/значений.
2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
2322138a8e mdbx: корректировка сообщения об ошибке. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
37867a0b84 mdbx: не обходим проверку когерентности в режиме восстановления. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
f0c43fb24a mdbx: без необходимости не объединяем не-грязные страницы в дереве. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
adf433a1bc mdbx-make: доработка макро для bench-целей. 2023-01-03 19:28:11 +03:00
Леонид Юрьев (Leonid Yuriev)
48bd3fc4c8 mdbx: упрощение default_prefault_write(). 2022-12-31 23:35:53 +03:00
Леонид Юрьев (Leonid Yuriev)
7ffea70087 mdbx: доработка loose-пути в page_retire(). 2022-12-31 23:35:53 +03:00
Леонид Юрьев (Leonid Yuriev)
ef460a9229 mdbx: выделение cursor_get() для уменьшения кол-ва проверок. 2022-12-29 23:03:12 +03:00
Леонид Юрьев (Leonid Yuriev)
df63ff0e7e mdbx: выделение cursor_del() для уменьшения кол-ва проверок. 2022-12-29 23:03:12 +03:00
Леонид Юрьев (Leonid Yuriev)
66a5704949 mdbx: выделение cursor_put() для уменьшения кол-ва проверок. 2022-12-29 19:26:50 +03:00
Леонид Юрьев (Leonid Yuriev)
61d21b0a02 mdbx: не трогать LRU и dbi в cursor_touch() для вложенных курсоров. 2022-12-29 01:20:04 +03:00
Леонид Юрьев (Leonid Yuriev)
0941319940 mdbx: парочка незначительных likely. 2022-12-29 01:20:04 +03:00
Леонид Юрьев (Leonid Yuriev)
bb2e3967eb mdbx: уменьшение кол-ва вызовов realloc(). 2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
e458af602e mdbx: устранение ненужных условий в отладке (несущественно). 2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
d29acf4fdc mdbx: актуализация bits.md (внутренний справочник). 2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
a06fe4f168 mdbx: переработка контроля "некогерентности" для уменьшения накладных расходов.
Существует проблема https://libmdbx.dqdkfa.ru/dead-github/issues/269,
которая проявляется только при специфической неупорядоченности внутри
ядра ОС, когда страницы, записанные в файл отображенный в память,
становятся видны в памяти посредством работы unified page cache:

 - если записанная последней мета-страница "обгоняет" ранее записанные,
   т.е. когда записанное в файл позже становится видимым в отображении
   раньше, чем записанное ранее.

Теперь, вместо постоянной полной сверки записываемых страниц,
выполняется легковесная проверка при старте транзакций, с переключением
в режим "как раньше" при обнаружении проблемы.

В результате, в некоторых сценариях возвращается 5-10%
производительности, а в отдельных синтетических тестах до 30%.
2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
0498114469 mdbx: обнуление информации о задержках для невалидных транзакций в mdbx_txn_commit_ex(). 2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
85828f677a mdbx: пересоздание пустой MAIN_DBI при необходимости. 2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
9cbbdfa025 mdbx: добавление const к аргументам функций получения и контроля страниц. 2022-12-27 11:50:28 +03:00
Леонид Юрьев (Leonid Yuriev)
686145ec2e mdbx: рефакторинг с удалением cursor_spill() и MDBX_NOSPILL. 2022-12-27 11:50:23 +03:00
Леонид Юрьев (Leonid Yuriev)
fe55f25665 mdbx: использование msync(MS_ASYNC) для спиллинга в режиме MDBX_WRITEMAP вне зависимости от MDBX_AVOID_MSYNC и MDBX_MMAP_USE_MS_ASYNC. 2022-12-22 00:48:41 +03:00
Леонид Юрьев (Leonid Yuriev)
e9a2042df1 mdbx: добавление MDBX_NOTHROW_PURE_FUNCTION к некоторым функциям. 2022-12-22 00:48:41 +03:00
Леонид Юрьев (Leonid Yuriev)
fd98a635d9 mdbx: не возвращаем ошибку при попытке закрытия MAIN_DBI. 2022-12-22 00:48:41 +03:00
Леонид Юрьев (Leonid Yuriev)
722c6ecf43 mdbx: use attribute(tls_model(local-dynamic)) as workaround for CLANG bug. 2022-12-22 00:48:40 +03:00