Commit Graph

4856 Commits

Author SHA1 Message Date
Леонид Юрьев (Leonid Yuriev)
d6f6579401 mdbx: update ChangeLog. 2025-08-24 10:49:28 +03:00
Леонид Юрьев (Leonid Yuriev)
e03f16999c mdbx: cleanup extra changes after the 5c6d91f7c. 2025-08-24 09:34:42 +03:00
Леонид Юрьев (Leonid Yuriev)
109858b994 mdbx-test: workaround for the ENOSPC from a tmpfs. 2025-08-24 09:34:42 +03:00
Леонид Юрьев (Leonid Yuriev)
466062151f mdbx: cleanup redundant MDBX_INTERNAL. 2025-08-24 09:34:42 +03:00
Леонид Юрьев (Leonid Yuriev)
2a7f460345 mdbx: fix unexpected SIGBUS is not enough space in a filesystem.
On a modern Linux the allocation of space for a file can be deferred
and/or lazy, rather than when setting its length using `ftruncate()`.
The actual allocation of space occurs when writing to the corresponding
areas of the file, or when reading ones (in this case, the file system
fills these areas with zeros).

The specific behavior depends on the type of file system and the kernel
version, but the main thing is that possibilities currently are, when
setting the file size, just the instantaneous ability to allocate space
is checked, without any booking.

If the file system is running out of space, an `ENOSPC` error may occur
when processing (inside a OS kernel) a page fault when accessing one of
the added pages after the database has been enlarged. In this case, the
OS kernel has no other alternative but to send a `SIGBUS` signal to the
process.

This commit fixes the problem by adding the use of system calls to
explicitly allocate space for a given file size.
Related-to https://github.com/erigontech/erigon/issues/16709

This is a simple improvement, however which is complicated by the need
to take into account the availability of the appropriate system API and
handle non-fatal errors from file systems that do not support the
appropriate operations. Therefore, there is a risk of regressions in
unusual/rare situations, including when hosting databases on network
media.
2025-08-22 13:46:49 +03:00
Леонид Юрьев (Leonid Yuriev)
f23a72f59c mdbx: update ChangeLog. 2025-08-05 13:33:47 +03:00
Леонид Юрьев (Leonid Yuriev)
43be7b05a7 mdbx: enabling older Linux kernels starting from 3.16 2025-08-05 12:44:13 +03:00
Леонид Юрьев (Leonid Yuriev)
289276f13c mdbx: merge-in ChangeLog from the stable/0.13.x branch. 2025-08-04 00:08:42 +03:00
Леонид Юрьев (Leonid Yuriev)
16f41ffcd1 mdbx: patch update for older versions of buildroot. 2025-08-04 00:07:34 +03:00
Леонид Юрьев (Leonid Yuriev)
584d5c344d mdbx: update ChangeLog. 2025-07-29 15:03:09 +03:00
Леонид Юрьев (Leonid Yuriev)
933565b1b2 mdbx-chk: count and report %-filling histogram of tree(s). 2025-07-29 14:50:47 +03:00
Леонид Юрьев (Leonid Yuriev)
0cc52a3cc3 mdbx-chk: report switching to non-exclusive/accede mode. 2025-07-29 14:50:42 +03:00
Леонид Юрьев (Leonid Yuriev)
457564c498 mdbx-chk: rename internal variables (cosmetics). 2025-07-29 14:50:42 +03:00
Леонид Юрьев (Leonid Yuriev)
3410e28e1f mdbx: fix comment typo. 2025-07-29 14:50:42 +03:00
Леонид Юрьев (Leonid Yuriev)
ecc36a11ec mdbx: report the parent-pgno in an issues during a DB check. 2025-07-28 14:36:47 +03:00
Леонид Юрьев (Leonid Yuriev)
5c6d91f7c8 mdbx: provide the parent-pgno during a tree traversal. 2025-07-28 14:36:47 +03:00
Леонид Юрьев (Leonid Yuriev)
79465dbc7f mdbx: refactor internal walking functions. 2025-07-28 14:36:47 +03:00
Леонид Юрьев (Leonid Yuriev)
d6f397145c mdbx: reorder logging functions. 2025-07-28 14:36:47 +03:00
Леонид Юрьев (Leonid Yuriev)
fb5f7f4f83 mdbx: dbi-related minor changes. 2025-07-27 21:47:12 +03:00
Леонид Юрьев (Leonid Yuriev)
f0e6db59e2 mdbx: update ChangeLog. 2025-07-26 16:12:53 +03:00
Леонид Юрьев (Leonid Yuriev)
2411b88812 mdbx: minor addition to README. 2025-07-26 16:12:05 +03:00
Леонид Юрьев (Leonid Yuriev)
a2547d21af mdbx-tests: random order of a parameterized tests inside the stochastic script. 2025-07-26 14:09:05 +03:00
Леонид Юрьев (Leonid Yuriev)
eef334235e mdbx: *** using english for commit titles at the request of community ***.
At the request of several non-Russian-speaking developers, it was
decided to return to using English in the commit' brief-headers at least.
2025-07-26 14:06:26 +03:00
Леонид Юрьев (Leonid Yuriev)
0899ea8450 mdbx-tests: актуализация секции cross-qemu в GNUmakefile. 2025-07-25 22:33:18 +03:00
Леонид Юрьев (Leonid Yuriev)
58dd21cf98 mdbx-tests: использование SysV-семафоров при cross-тестах посредством qemu. 2025-07-25 22:33:18 +03:00
Леонид Юрьев (Leonid Yuriev)
0da87b6423 mdbx: ссылки на зеркала в документации. 2025-07-25 14:15:23 +03:00
Леонид Юрьев (Leonid Yuriev)
39326e79bc mdbx: дополнение ChangeLog. 2025-07-20 16:39:58 +03:00
Леонид Юрьев (Leonid Yuriev)
6f49e7dfeb mdbx: переработка ошибок файловых блокировок в API копирования с устранением проблемы на OSX.
На POSIX-платформах внутри API копирования используются файловый
блокировки `fcntl(F_SETLK)` и `flock()`, так как только совместное
использование обеспечивает блокировку на всех платформах и файловых
системах, включая NFS и SMB.

Однако, в зависимости от платформы, версии ядра ОС, типа файловой
системы, а в случае NFS/SMB также от удаленной стороны, используемые
системные файловые блокировки могут не работать или конфликтовать между
собой (в частности на OSX).

Поэтому в этом коммите реализуется более гибкий подход. Если кратко,
то допускается отказ одной из блокировок при успехе другой:

 - При успехе fcntl(F_SETLK) допускается EAGAIN/EWOULDBLOCK и EREMOTEIO от flock(),
   если целевой файл на не-локальной файловой системе, а также на не-Linux платформах,
   где одновременная блокировка может быть не разрешена fcntl(F_SETLK) и flock().

 - При успехе flock() допускается ENOTSUP и REMOTEIO от fcntl(F_SETLK),
   если целевой файл на не-локальной файловой системе.
2025-07-20 16:21:15 +03:00
Леонид Юрьев (Leonid Yuriev)
43f3deee00 mdbx: условное определение MDBX_ENOSYS как ENOTSUP/ENOSYS. 2025-07-20 16:21:15 +03:00
Леонид Юрьев (Leonid Yuriev)
65b9b5ec6d mdbx-tests: дополнение extra/dbi. 2025-07-19 21:18:50 +03:00
Леонид Юрьев (Leonid Yuriev)
0d73718000 mdbx: устранение возможности неверного возврата MDBX_DBS_FULL при открытии DBI-дескрипторов.
В lockfree-пути открытия DBI-дескрипторов, при просмотре уже открытых
таблиц, пропускались элементы отличающиеся не только по имени, но также
и при несовпадении запрашиваемых флагов и актуальных флагов уже открытой
таблицы.

Если при этом уже было достигнуто (ранее заданное) максимальное
количество открытых DBI-дескрипторов, то возвращалась ошибка
`MDBX_DBS_FULL`, в том числе в ситуациях когда результат должен быть
другим.

Спасибо [Артёму Воротникову](https://github.com/vorot93) за сообщение о проблеме!
2025-07-19 21:18:43 +03:00
Леонид Юрьев (Leonid Yuriev)
8ebdc6d79b mdbx: переделка обновления/загрузки флагов MainDB с выделением latch_maindb_locked().
В новом коде:
 - нет необходимости в захвате глобальной txn-блокироки;
 - меньше вероятность коллизий/гонок.
2025-07-19 21:18:43 +03:00
Леонид Юрьев (Leonid Yuriev)
9c6eed615a mdbx-tests: дополнение extra/txn сценарием провоцирующим гонку за атрибуты MainDB-DBI. 2025-07-19 21:18:43 +03:00
Леонид Юрьев (Leonid Yuriev)
f5e3cfd533 mdbx: устранение неожиданной ошибки MDBX_BAD_DBI при гонках внутри процесса.
Запуск читающих и пишущих транзакций взаимно не блокируется. Однако,
внутри одного процесса, DBI-хендлы и атрибуты таблиц используются
совместно всеми транзакциями (в рамках экземпляра среды работы с БД).
Поэтому после изменения атрибутов таблиц, в том числе при первоначальном
чтении актуальных атрибутов MainDB, может возникать состояние гонок при
одновременном старте нескольких транзакций.

Этим коммитом исправляются недочеты в обработке ситуации таких гонок,
из-за чего могла возвращается неожиданная (с точки зрения пользователя)
ошибка `MDBX_BAD_DBI`.

Формально ошибка присутствовала начиная с коммита `e6af7d7c53428ca2892bcbf7eec1c2acee06fd44` от 2023-11-05.
Однако, до этого (исторически, как было унаследовано от LMDB)
отсутствовал какой-либо контроль смены атрибутов MainDB во время старта
и/или работы транзакций. Поэтому вместо возврата каких-либо ошибок
подобные состояние гонок и/или связанные с изменением атрибутов MainDB
оставались необработанными/незамеченными, либо проявлялись как редкие
неуловимые сбои пользовательских приложений.

Спасибо [Артёму Воротникову](https://github.com/vorot93) за сообщение о проблеме!
2025-07-19 21:18:41 +03:00
Леонид Юрьев (Leonid Yuriev)
e9d47291b0 mdbx: косметический рефакторинг txn_renew(). 2025-07-15 19:01:17 +03:00
Леонид Юрьев (Leonid Yuriev)
0c70b548e8 mdbx-make: добавление цели check-posix-locking для CI-тестов всех вариантов POSIX-блокировок. 2025-07-14 21:06:39 +03:00
Леонид Юрьев (Leonid Yuriev)
b2a7942f8d mdbx-cmake: переформатирование свойств тестов для удобочитаемости. 2025-07-14 17:04:19 +03:00
Леонид Юрьев (Leonid Yuriev)
2b115069c1 mdbx: исправление resurrect-after-fork при использовании SysV-семафоров (MDBX_LOCKING=5).
Ошибка/недоработка была с первой реализации resurrect-after-fork в
ноябре 2023, но оставалась не замеченной из-за отсутствия
CI-тестирования на платформе OSX/Mac (где нет поддержки разделяемых
мьютексов).
2025-07-14 17:03:38 +03:00
Леонид Юрьев (Leonid Yuriev)
90a4e1847d mdbx: удаление лишней/отладочной assert-проверки внутри cursor_put(). 2025-07-14 00:44:35 +03:00
Леонид Юрьев (Leonid Yuriev)
2a41db6b67 mdbx-windows: исправление assert-проверок внутри txn_lock()/txn_unlock(). 2025-07-14 00:41:48 +03:00
Leonid Yuriev
8fba09ceb6 mdbx: исправление опечатки в отладочном логировании. 2025-07-14 00:40:40 +03:00
Леонид Юрьев (Leonid Yuriev)
62f4986731 mdbx-make: изменение кол-ва внутренних итераций прогона тестов для уменьшения затрат на CI. 2025-07-12 20:53:04 +03:00
Леонид Юрьев (Leonid Yuriev)
1b1bec2b30 mdbx: отключение MSVC предупреждений C5286 и C5287. 2025-07-11 10:44:17 +03:00
Leonid Yuriev
c7b119af68 mdbx: исправление сравнения знакового и беззнакового значений. 2025-07-11 10:36:32 +03:00
Леонид Юрьев (Leonid Yuriev)
57ffdf6cd9 mdbx-tests: дополнение cmake-тестов сценариями запуска mdbx_copy. 2025-07-11 10:36:09 +03:00
Леонид Юрьев (Leonid Yuriev)
e28f484947 mdbx: удаление лишних/вредных assert-проверок внутри txn_lock()/txn_unlock(). 2025-07-11 10:36:09 +03:00
Леонид Юрьев (Leonid Yuriev)
53c14bc92c mdbx-tools: добавление опции -f в утилиту mdbx_copy. 2025-07-11 10:36:09 +03:00
Леонид Юрьев (Leonid Yuriev)
4bb69a1c8f mdbx-tests: простейшее тестирование MDBX_CP_OVERWRITE. 2025-07-11 10:36:09 +03:00
Леонид Юрьев (Leonid Yuriev)
ba6ce86d5f mdbx: добавление опции MDBX_CP_OVERWRITE в API копирования БД. 2025-07-11 10:36:09 +03:00
Леонид Юрьев (Leonid Yuriev)
fa73f44ff0 mdbx: дополнение ChangeLog. 2025-06-28 10:48:11 +03:00