2376 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
0f92baaa5e mdbx: обновление debug_begin.h и debug_end.h 2022-11-19 19:36:30 +03:00
Jan Biedermann
eaf063ca9b mdbx: fix typo of || inside #if byte-order condition.
https://gitflic.ru/project/erthink/libmdbx/merge-request/4
2022-11-19 19:36:30 +03:00
Леонид Юрьев (Leonid Yuriev)
6c840cf58e mdbx: подсчет грязных страниц в режиме MDBX_WRITEMAP для статистики. 2022-11-19 19:36:30 +03:00
Леонид Юрьев (Leonid Yuriev)
9b062cf0c7
mdbx: выпуск v0.12.2 (Иван Ярыгин)
Выпуск с существенными доработками и новой функциональностью
в память о российском борце [Иване Сергеевиче Ярыгине](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>
2022-11-11 17:35:32 +03:00
Леонид Юрьев (Leonid Yuriev)
b274a35410 mdbx-doc: дополнение man-страниц утилит описанием опций -u и -U. 2022-11-11 16:44:51 +03:00
Леонид Юрьев (Leonid Yuriev)
3704433aa9 mdbx: минорное удаление мертвого/ненужного кода из page_alloc_slowpath(). 2022-11-10 16:34:23 +03:00
Леонид Юрьев (Leonid Yuriev)
70e8006776 mdbx-docs: перенаправление github-ссылок на web-archive. 2022-11-10 15:54:31 +03:00
Леонид Юрьев (Leonid Yuriev)
8ffb0bb3d8 mdbx-cmake: поддержка всех основных опций при сборке посредством CMake. 2022-11-10 15:39:52 +03:00
Леонид Юрьев (Leonid Yuriev)
2dfdac2821 mdbx-windows: повтор чтения заголовка при ERROR_LOCK_VIOLATION. 2022-11-08 23:32:34 +03:00
Леонид Юрьев (Leonid Yuriev)
c270306580 mdbx-windows: уточнение проверок макросов MinGW и устранение предупреждений. 2022-11-08 20:39:44 +03:00
Леонид Юрьев (Leonid Yuriev)
652ca2b5cb mdbx-windows: исправление минорных предупреждений MingGW. 2022-11-08 20:39:44 +03:00
Леонид Юрьев (Leonid Yuriev)
3ee223514d mdbx: очистка readers_refresh_flag для page_alloc_slowpath(). 2022-11-07 14:16:59 +03:00
Леонид Юрьев (Leonid Yuriev)
f7f94bb698 mdbx: чуть больше const для прозрачности. 2022-11-07 14:16:35 +03:00
Леонид Юрьев (Leonid Yuriev)
f0c6aa4646 mdbx: workaround for false-positives from Valgrind bug. 2022-11-07 00:47:16 +03:00
Леонид Юрьев (Leonid Yuriev)
771c85a880 mdbx: уточнение txn_space_dirty в соответствии с обновленным учетом грязных страниц. 2022-11-07 00:44:38 +03:00
Леонид Юрьев (Leonid Yuriev)
4f1f9141f4 mdbx: добавление MDBX_ENABLE_PGOP_STAT и MDBX_ENABLE_PROFGC во внутреннюю строку с опциями сборки. 2022-11-07 00:44:38 +03:00
Леонид Юрьев (Leonid Yuriev)
f680c99116 mdbx: переделка page_alloc_slowpath() с добавлением профилирования GC. 2022-11-07 00:44:37 +03:00
Леонид Юрьев (Leonid Yuriev)
acaa1d82d9 mdbx: minor touch assertions for issue#7.
https://gitflic.ru/project/erthink/libmdbx/issue/7
2022-11-05 14:06:00 +03:00
Леонид Юрьев (Leonid Yuriev)
47e7a646fd mdbx: переделка отслеживания mlocks для игнорирования EINVAL от madvise(). 2022-11-05 14:06:00 +03:00
Леонид Юрьев (Leonid Yuriev)
d4e67d14ce mdbx: исправление неожиданного MDBX_BUSY из mdbx_env_set_option(). 2022-11-03 17:23:32 +03:00
Леонид Юрьев (Leonid Yuriev)
91a6e84cab mdbx-windows: попытка борьбы с ложно-положительными конфликтами LockFileEx(). 2022-11-03 13:00:35 +03:00
Леонид Юрьев (Leonid Yuriev)
28e2e31949 mdbx: выделение специфической инициализации в osal_ctor(). 2022-11-02 11:09:32 +03:00
Леонид Юрьев (Leonid Yuriev)
9eaf86bde1 mdbx-tools: добавление опций -u и -U для использования mdbx_env_warmup(). 2022-10-24 12:50:15 +03:00
Леонид Юрьев (Leonid Yuriev)
d661d4bac7 mdbx: добавление mdbx_env_warmup() 2022-10-24 11:37:57 +03:00
Леонид Юрьев (Leonid Yuriev)
4e95a079ee mdbx: переименование MDBX_COMMIT_PAGES в MDBX_AUXILARY_IOV_MAX. 2022-10-22 11:12:52 +03:00
Леонид Юрьев (Leonid Yuriev)
753fa13048 mdbx: удаление лишних комментариев. 2022-10-22 11:12:52 +03:00
Леонид Юрьев (Leonid Yuriev)
8833dc6871 mdbx: костыль для обхода ошибок encryptfs.
Выяснилось что утилита `mdbx_copy` и функции `mdbx_env_copy()` могут
создавать ПРОБЛЕМЫ если целевой файл расположен в encryptfs (такая
файловая система в Linux).

При этом может быть четыре исхода в зависимости от версии ядра и
положения звезд на небе:
 - всё хорошо;
 - плохие данные в копии без возврата ошибок;
 - ошибка EINVAL(22) при копировании;
 - oops или зависание ядра, отвал смонтированной encryptfs и т.п.

В текущем понимании, причина обусловлена ошибой в коде fs, которая
проявляется при использовании системного вызова `copy_file_range`.
2022-10-22 01:38:33 +03:00
Леонид Юрьев (Leonid Yuriev)
80f9f73a5e mdbx: чуть больше контроля и паранойи для страховки от дефектов mremap().
Есть основание полагать, что mremap() может возвращать MAP_FAILED, но НЕ
устанавливать errno в некоторых пограничных ситуациях. Например, когда
системных ресурсов не хватает на актуализацию/копирование/клонирование
состояния отображения на финальной стадии, в том числе из-за раскраски
исходного отображения разными флагами через madvise().
2022-10-14 00:20:37 +03:00
Леонид Юрьев (Leonid Yuriev)
6c986ce904 mdbx: костыль для старых версий stdatomic.h, где макросы ATOMIC_*_LOCK_FREE ошибочно переопределяются через функции. 2022-10-13 19:28:01 +03:00
Леонид Юрьев (Leonid Yuriev)
f5fee949e3 mdbx: починка сборки для старых версий glibc после задействования fcntl64(). 2022-10-13 17:30:43 +03:00
Леонид Юрьев (Leonid Yuriev)
d94e65b870 mdbx: использование fcntl64(F_GETLK64/F_SETLK64/F_SETLKW64) при наличии.
Это решает проблему срабатывания проверочного утверждения при сборке для
платформ где тип off_t шире соответствующих полей структуры flock,
используемой для блокировки файлов.
2022-10-12 21:25:18 +03:00
Леонид Юрьев (Leonid Yuriev)
5a45c4a210 mdbx-windows: удаление ненужного вызова LockFileEx() внутри mdbx_env_copy(). 2022-10-12 21:25:18 +03:00
Леонид Юрьев (Leonid Yuriev)
686c908a95 mdbx: более осторожное преобразование к типу mdbx_tid_t для устранения предупреждений. 2022-10-12 21:25:18 +03:00
Леонид Юрьев (Leonid Yuriev)
e5fc056035 mdbx: изменение формата LCK и семантики некоторых внутренних полей.
Изменение формата LCK-файла означает что версии libmdbx использующие
разный формат не смогут работать с одной БД одновременно, а только
поочередно (LCK-файл переписывается при открытии первым открывающим БД
процессом).

1. Поле mti_unsynced_pages теперь 64-битное (чтобы не контролировать
переполнение) и перемещено для соблюдения выравнивания.

2. Поле mti_sync_timestamp переименовано в mti_eoos_timestamp
одновременно со сменой семантики. Теперь время отсчитывается не от
момента сброса данных на диск, а с момента входа в «грязное» состояние.

Скорее всего, текущая версия формата LCK не окончательная
и изменится до релиза.
2022-10-12 21:25:18 +03:00
Леонид Юрьев (Leonid Yuriev)
5242c5bfdc mdbx: улучшение эвристики включения авто-слияния записей GC. 2022-10-10 21:06:33 +03:00
Леонид Юрьев (Leonid Yuriev)
329af93436 mdbx: уменьшение в 42 раза значения по-умолчанию для me_options.dp_limit в отладочных сборках. 2022-10-10 19:26:38 +03:00
Леонид Юрьев (Leonid Yuriev)
22a84d656b mdbx: проверка атомарности C11-операций c 32/64-битными данными. 2022-10-10 19:24:14 +03:00
Леонид Юрьев (Leonid Yuriev)
c3dd60fcb6 mdbx: добавление mdbx_env_get_pairsize4page_max() и mdbx_env_get_valsize4page_max(). 2022-10-10 16:33:51 +03:00
Леонид Юрьев (Leonid Yuriev)
9cdee2adb5 mdbx-cmake: добавлена поддержка опции MDBX_AVOID_MSYNC. 2022-10-10 15:55:20 +03:00
Леонид Юрьев (Leonid Yuriev)
98e29fe628 mdbx-windows: UNICODE-зависимое определение макросов MDBX_DATANAME, MDBX_LOCKNAME и MDBX_LOCK_SUFFIX. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
98a2bd785a mdbx-windows: перемещена декларация osal_mb2w() для ликвидации предупреждений. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
138a83c2be mdbx: добавлена несколько MDBX_MAYBE_UNUSED для ликвидации предупреждений. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
92d203a12c mdbx: исправление ложного срабатывания контроля "invalid page-address" в page_check().
При проверке использовалось глобальное значение me_dxb_mmap.current,
к которому не должны обращаться читающие транзакции. В результате,
в сложных много-поточных сценариях с изменением размера БД и её
переполнением, проверка могла выдавать ложно-положительный результат.

С точки зрения пользователя, ошибка могла проявляться как возврат
`MDBX_CORRUPTED` из читающей транзакции, когда включен "безопасный
режим" (дополнительный контроль), а в параллельной пишущей транзакции
происходит увеличение размера БД с последующим переполнением и откатом
этой транзакции. При этом никакого повреждения структуры БД нет.
2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
63b4d2289d mdbx: удаление utf8bom для устранения проблем амальгамации кода. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
688ec3e85c mdbx-test: добавление исключений Valgrind для нового кода. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
14eda2cd17 mdbx-windows: использование _CrtDbgReport() в отладочных сборках. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
ad09164604 mdbx: минорное исправление для устранения срабатывания проверочного утверждения в отладочных сборках.
Ассерт мог срабатывать из-за отсутствия бита P_LEAF2 в передаваемом проверочном значении.
На что-либо другое не влияло, но не следует понять почему этот недочет ны был выявлен тестами раньше.
2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
db72763de0 mdbx: отключение учета грязных страниц в не требующих этого режимах.
В режиме MDBX_WRITEMAP с опцией сборки MDBX_AVOID_MSYNC=0 отслеживание грязных страниц не требуется.
Эта доработка устраняет еще одну  из недоделок (пункт в TODO).
2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
940ef30659 mdbx: спиллинг грязных страниц с учетом их суммарного размера. 2022-10-10 13:56:57 +03:00
Леонид Юрьев (Leonid Yuriev)
f6eec7195b mdbx: защита от нуля только общей задержки в метриках транзакции.
Ранее, при конвертации очень коротких интервалов в формат фиксированной
точки 16-точка-16, всегда выполнялось замещение нуля единицей. Т.е. если
интервал был не нулевым, но меньше 15.259 микросекунд (1/65536 секунды),
то вместо 0 возвращалось 1.

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

Теперь такая защита от нуля выполняется только для общего времени,
но не для отдельных стадий.

Было:
	latency(ms): preparation=72.69 gc=72.69 write=73.04 sync=141.40 ending=72.69 whole=142.14
	Аккумулированная сумма длительности этапов ВТРОЕ(!) больше общей длительности.

Стало:
	latency(ms): preparation=0.00 gc=0.02 write=0.79 sync=67.98 ending=0.00 whole=140.81
	Аккумулированная сумма длительности этапов меньше общей длительности,
	так как для каждой транзакции общая длительность возвращается не менее 15.259 микросекунд.
2022-10-10 13:56:57 +03:00