2026-07-18 mdbx: update ChangeLog. 2026-07-18 mdbx++: add a few comments. 2026-07-18 mdbx++: fix F4 UTF-8 continuation range to 80..8F. 2026-07-18 mdbx: fix mincore_cache shift to iterate from the end. 2026-07-18 mdbx-chk: fix wrong function name in env sync error reporting.
204 KiB
ChangeLog
The source code is available on SourceCraft and mirror on GitHub.
Please use the stable branch or the latest release for production environment through staging, but the master branch for development a derivative projects.
Donations are welcome to ETH 0xD104d8f8B2dC312aaD74899F83EBf3EEBDC1EA3A,
BTC bc1qzvl9uegf2ea6cwlytnanrscyv8snwsvrc0xfsu, SOL FTCTgbHajoLVZGr8aEFWMzx3NDMyS5wXJgfeMTmJznRi.
Всё будет хорошо!
v0.14.3 is scheduled for 2026-07-23.
The supporting release of a stable branch with bug fixes.
Important:
- Starting from v0.14.3, the 0.14.x branch gets stable status and will only receive bug fixes, but other improvements only in exceptional cases. Further development will be continued under the 0.15.x branch.
Appreciations:
- Cosmin Apreutesei for bugs reporting.
- stslam for Embarcadero C++ Builder support.
- Yi Chen for bugs fixing.
- cui for discovery and fixing bugs.
Backward compatibility breaks:
-
Now API functions that do not receive a transaction in arguments, but require a write lock, always checks that the current thread owns (launched) the writing transaction. If the current thread does NOT own the writing transaction (did not start it), then the write-transaction lock will be acquired. This can lead to deadlock in
MDBX_NOSTICKYTHREADSmode!These functions include:
mdbx_env_set_flags(),mdbx_env_set_option();mdbx_env_set_geometry();mdbx_env_sync_ex(),mdbx_env_sync(),mdbx_env_sync_poll();mdbx_env_stat(),mdbx_env_stat_ex()when called withtxn=nullptr;mdbx_env_defrag(),mdbx_env_close_ex(),mdbx_env_close();
Deadlock in
MDBX_NOSTICKYTHREADSmode can only occur when a writing transaction is started in one thread, and a synchronous call to one of the listed above functions is performed in the other, in a context that prevents the completion of a running writing transaction:- a writing transaction has been started, and an application logic of its completion is waiting for some work to be done by other threads;
- one of these threads, which must be done before completing the writing transaction, calls one of the specified functions;
- deadlock: such a thread will wait for the completion of the transaction, and the thread will wait on the lock, which will be released upon completion of the transaction.
-
Some deprecated enums and defines were removed from API.
-
On Windows platform the Windows-10 API is now used by default. Previous versions are still supported, but now they should be explicitly requested during library build by defining
_WIN32_WINNT.
Improvements:
-
Deferred invalidation of the dbi-handles of dropped tables has been implemented until the corresponding transactions are committed.
Previously, libmdbx implemented the behavior historically inherited from LMDB, when handles of a dropped tables were immediately closed, regardless of the possible subsequent abortion of such transactions. Now, when tables are dropped, both ones associated handles and data remain available for other transactions running in parallel within the current process.
This improvement has been asking for a long time, but it required a lot of preparation and refactoring which are done step-by-step during a few last releases.
-
Embarcadero C++ Builder now could be used to build libmdbx on Windows.
-
Allowed to use cursors binded to the same table/DBI, but to different read-only transaction, in an API with multiple cursors in the parameters.
-
Added the missing recipe for Conan to an amalgamated source code.
-
Added check-and-retry of presync-to-disk condition to avoid latency spikes in commit path during asynchronous calls of
mdbx_env_sync(),mdbx_env_sync_ex(),mdbx_env_sync_poll(). -
Added the
MDBX_opt_presync_thresholdoption. -
In the C++ API the move assignment operator of the
mdbx::buffer<>template now supports the case of unequal allocators by copying the contents of a source. -
Added adjustment of the maximum size of the database and memory mapping in the modes of using Valgrind or AddressSanitizer, which greatly simplifies the use of these tools.
-
For Windows, the
MDBX_WITHOUT_MSVC_CRT=ONbuild mode has been significantly improved using ntdll functions to eliminate dependence on MSVC CRT. Among other things, now there is a replacement for the __try/__except/__finally operators, support for Structural Exception Handling in theSAFESEHmode, simple substitution of _load_config_used, etc.
Fixes:
-
Fixed assertions triggering in specific scenarios of creating and renaming tables within nested transactions.
-
Fixed the issue of losing a table content after abortion the nested transaction where such table was dropped.
-
Fixed
ERROR_LOCK_VIOLATIONduring defrag on Windows in operation modes using overlapped I/O. -
Fixed off-by-one bugs in the
mdbx::from_base64andmdbx::slice::is_printable(). -
Fixed major typo in condition inside
latch_maindb_locked(). However, despite the severity of the error, the scenario of its manifestation could not be found due to a combination of other checks in the code. -
Fixed possibility of infinite loop inside
mdbx_txn_abort()because ofmemcmp()/memcpy()typo. -
Fixed
env_owned_wrtxn()to avoid by-pass locking in theMDBX_NOSTICKYTHREADSmode. -
Fixed missing
returnstatement in one of the error paths insidemdbx_cursor_bind(). -
Fixed potential buffer overread by
fgets()inmdbx_loadutility. -
Fixed a lot of typos and a few bugs detected by CodeQL.
-
Fixed ODR-violations warnings from modern GCC while both LTO and UBSAN are enabled.
-
Fixed unreasonably high memory 2GB consumption in
mdbx_loadutility due to leftover debug changes. -
Fixed running
ctest -T memcheckby adding workaround of CTest/CMake bugs for Valgrind parameters. -
Fixed/removed leftover usage of float point in
mdbx_statutility. -
Fixed
mach_port_tleak insidemdbx_get_sysraminfo(). -
Fixed Windows section handle leak inside
osal_mresize()in unsuccessful case. -
Fixed
mdbx_defragfor-foption handling. -
Fixed UTF-8 U+100000..U+10FFFF range checking/decoding inside
mdbx::slice::is_printable(). -
Fixed loss of
mincore()cache due erase/overwrite on insert.
v0.14.2 "Буревестник" (stormy petrel, aka Bourevestnik) at 2026-05-14
The forward-looking release with new major features and internal refactoring.
Important:
-
Due to numerous user requests, this ChangeLog will be kept in English. However, it should be noted that it was originally provided in Russian and then translated by AI during the formation of the release, because of this, there may be flaws in the text.
-
Since 2026 libmdbx project has changed its code development and distribution model. To get acquainted with important changes and plans, we recommend reading the compact presentation "libmdbx: successes, obstacles, goals and roadmap", which contains important explanations in the form of embedded comments.
-
The upstream of libmdbx project has been relocated to the jurisdiction of the Russian Federation. We are confident that this will protect the project from any sanctions and ensure its accessibility to all users around the world. Please use https://libmdbx.dqdkfa.ru for documentation and https://sourcecraft.dev/dqdkfa/libmdbx for the source code. Nonetheless libmdbx is still open source and provided with first-class free support.
Appreciations:
- Erigon for sponsorship.
- The "AntiPublic" project for sponsorship.
- Artyom Vorotnikov for Rust bindings, reporting bugs and testing.
- Stefan de Konink for Python bindings and documentation improvement.
- Cosmin Apreutesei for error reporting and testing.
- Chloe Cano for fuzzing, bug reporting and fixes.
- Weixie Cui for bug fixing through many pull-requests.
- Alexander Kelchin (the "Serebrium" Company) for error messages and prototypes of exploits.
- Anton Maisak for new .NET bindings.
Backward compatibility breaks:
-
The typedefs of the various callbacks are now unified and includes an asterisk of indirection in
Csyntax notation. Perhaps this is the most annoying change that breaks the builds and requires changing your code. However, it is necessary to restore order. In most cases, the required changes are limited to removing the*chars after a callback type(s). -
The size and composition of the
MDBX_envinfostructure has been changed, and themdbx_env_info_ex()function no longer supports the old versions. This breaks the compatibility of the ABI with older versions of the library, but preserves API compatibility at the source code level. -
The template
mdbx::buffer<ALLOCATOR, POLICY>is now inherited frommdbx::sliceandmdbx::buffer_tag, which simplified the C++ API and the use of the meta-programming approach. -
When building using GNU Make and CMake now, instead of a single
config.h, differentconfig-gnumake.handconfig-cmake.hfiles are generated. -
It is forbidden to open existing tables with different flags, unless the
MDBX_DB_ACCEDEoption is explicitly set. -
The dumps generated by the
mdbx_dumputility no longer output the current size of the database andmaxreaders, so that the contents of the dump depend only on the contents of the database. -
The build option
MDBX_FORCE_ASSERTIONShas been deprecated, andMDBX_CHECKING(within range of-1..3) should be used instead. -
The
NDEBUGmacro, which is generally accepted in C, no longer affects assert checks inside the library, but retains its traditional influence on assert checks related to argument control in the inline methods of theC++API.
New features:
-
Implemented "Early GC Cleanup".
Now the recycled GC records are deleted not when the writing transaction is committed, but as soon as possible. This opens the way to the implementation of explicit defragmentation (without copying the database) and further to non-sequential GC processing (which will eliminate the problem of DB swelling/overflow due to GC processing stopping during long-term reading transactions).
The amount of overhead is now proportional to the volume of operations performed. Therefore, in most scenarios, the overhead is slightly less, but on the contrary, a little more when canceling nested transactions.
-
Database defragmentation/compaction support has been implemented and the
mdbx_defragutility has been added with a set of command-line options that allow you to define key parameters and defragmentation limits. -
API Extension:
- the
MDBX_CP_OVERWRITEoption has been added to the database copy function (overwriting the target file), and themdbx_copyutility has a similar command-line option-f. - added the functions
mdbx_cursor_bunch_delete()andmdbx_cursor_delete_range(), which perform massive deletion of adjacent elements much faster by excluding pages and branches with deleted items from a B-tree entirely. - added data retrieval functions with "caching" the
mdbx_cache_get()andmdbx_cache_get_SingleThreaded(). - added the
mdbx_txn_refresh()function to quickly refresh the reading transaction. - added the
mdbx_txn_checkpoint()function to commit write transaction without releasing locks. - added the
mdbx_txn_commit_embark_read()function to commit a writing transaction and start a reading one without interfering with other changes. - added the
mdbx_txn_amend()function to change data starting from a snapshot of the data used in a given read transaction. - added the
mdbx_txn_rollback()function to abort and restart a transaction with the cancellation of all changes, but without releasing locks. - added support for cloning reading transactions using
mdbx_txn_clone(). - added support for nested read-only transactions.
- added the
mdbx_gc_info()function to get information about GC, page usage, and the ability to iterate GC content. - added the
mdbx_env_defrag()function for explicit DB defragmentation, as well as themdbx_defragutility. - added the
MDBX_opt_split_reserveoption to control the fullness of tree pages when splitting them. - added the functions
mdbx_cursor_distance(),mdbx_cursor_scroll()andmdbx_cursor_distribute()to simplify multithreaded parallel scanning.
- the
-
Support for Harmony OS (OHOS) and Haiku OS.
-
Floating-point operations are no longer used both inside the library and in utilities, and linking to
libmhas been removed from build scripts. -
It is possible to set debugging options
MDBX_DBG_ASSERT,MDBX_DBG_AUDITand others through environment variables. However, the corresponding debugging capabilities still need to be activated during the build. -
Expanded and redesigned the composition of information generated by the function
mdbx_chk_env()and the output utilitymdbx_chk. -
The main libmdbx repository has been migrated from GitFlic to SourceCraft.
For my part, I am saddened by the need to perform such manipulations, because they create significant inconvenience to users, but (unfortunately) there are sufficient reasons for this:
- Instead of the promised internationalization, GitFlic has only a Russian-language localization with a lot of technical features that make it difficult to use machine translation systems. This made it impossible for many users to use the service and generated a number of legitimate complaints/reproaches, including from developers from China, Brazil, Korea, Iran, etc.
- In the three years since migrating to GitFlic, several outrageous errors in the markdown editor have not been fixed, which turned the design of releases into an annoying struggle. In addition, the development roadmap has disappeared from the public space. In total, this forced me to abandon GitFlic.
-
The number of page receiving/loading operations has been added to the transaction statistics, which makes it possible to quantify the amount of work with cursors and the effectiveness of various indexing and data retrieval approaches. The collection of relevant statistics is controlled by the additional build option
MDBX_ENABLE_PGET_STAT. -
The command-line options
-b number,-L megabytes,-d percentand-G geometryhave been added to themdbx_loadutility, allowing you to set the size of batch inserts, limit the volume of transactions, set the desired page filling density and redefine the geometry of the database when loading data from a dump. -
Search was accelerated by using a branchless algorithm and embedding code of built-in/default comparators.
-
Redesigned internal verification statements and related build options. At the same time,
NDEBUGno longer affects checks in the main engine code, which eliminates the causes of unexpected performance drops due to the lack of a definition ofNDEBUGin non-debugging builds of users.The checks are divided into three categories (cheap, medium, expensive), controlled by the build option
MDBX_CHECKING, which takes values from-1to3inclusive. The value of3corresponds to the maximum number of checks, and-1disables both allassert()andENSURE()checks. By default,MDBX_CHECKINGis assumed to be equal to theMDBX_DEBUGoption, which in turn defaults to0, which corresponds to a regular (non-debugging) library build. This way, compatibility with the previous behavior is maintained and at the same time precise control of debugging checks is ensured.
Behavior change:
-
Re-enabled/enabled on older Linux kernels, starting with version 3.16, since now there is no reason to stop working on 3.16 while supporting 4.x kernels, and there are still projects (Isar, Isar-Community, Hive) that require such support.
-
The default value of the page merge threshold has been changed from 25% to 33%.
-
To reduce the likelihood of unexpected errors due to transients and delayed processing in the OS kernel during competitive closing and opening of databases by different processes, the number of repeated attempts to capture locks has been tripled. Presumably, this will also solve the problem of unexpected
EAGAIN(11) errors on Android when restarting applications and opening the database immediately after closing. -
By default, Windows builds are now performed using the Windows 10 SDK, rather than Windows 7.
-
The error
MDBX_WANNA_RECOVERYwhen opening the database in read-only mode is now returned if the database size is not a multiple of the system page size, but not a multiple of the size of the virtual memory allocation block is ignored. This eliminates the regression that occurred due to a change in behavior after using the system callfallocate()to preventSIGBUSafter incrementing the database file in a populated file system.
Other improvements:
-
The logic of not using OFD locks on POSIX platforms has been finalized. Now, in addition to
EINVAL, additional error codes are taken into account (ENOSYS,ENOIMPL,ENOTSUP,ENOSUPP,EOPNOTSUPP), which will allow the compiled library to work in some cases when the current kernel/container/emulator does not support the required system calls. -
The tests are supplemented with scenarios to check the added features, identified regressions and errors.
-
Support for the
--numa#option has been added to the test framework to link a stochastic test to a NUMA node, and explicit distribution across NUMA nodes has been added to the battery/tmux script, which significantly increased efficiency when testing on NUMA machines. -
The stochastic script implements a random order of running individual tests.
-
The output of a histogram of filling pages forming the tree structure and participating in split/merge/rebalance operations has been added to the database integrity verification functionality and the mdbx_chk utility.
-
A workaround has been added for Android to reduce the likelihood of an
EAGAINsystem error due to a lack of system resources and transients when closing and quickly re-opening the database. -
For Linux, added error prevention in the fast_commit implementation of the Ext4 file system.
-
Support for the "Skip" and "Repeat" options has been added to debugging builds on Windows when assert checks are triggered.
-
File locks used on the Windows platform involve waiting with timeouts, which theoretically should reduce the likelihood of
ERROR_LOCK_VIOLATION(33) errors when opening a database in competitive scenarios. -
Redesign of the buffer implementation and other improvements in the C++ API.
-
The tests fixed several minor memory leaks and the UBSAN warning about the
memcmp(, length = 0)call.
Fixes:
-
Almost all of these fixes were included in previous releases of the stable branch version 0.13.x. Therefore, should not assume that these fixes are related specifically to release 0.14.2.
-
Fixed a critical error in the
mdbx_env_resurrect_after_fork()functionality when using SysV semaphores.The error appeared only after the child process was generated by
fork()against the background of an ongoing writing transaction, which led to incorrect operation of semaphores and further to a variety of errors, up to database corruption. The problem has existed since the appearance ofmdbx_env_resurrect_after_fork()and affected OSX as well as POSIX platforms when building with the optionMDBX_LOCKING=5. -
Fixed a problem in the database copying API on POSIX systems other than Linux, as well as in some cases when the target file is located on a non-local file system. The problem manifested itself mainly on OSX, with the return of the error
EWOULDBLOCK/EAGAIN(35), due to a flaw/conflict between the locksfcntl(F_SETLK)andflock()in the OS kernel. The error handling of file lock capture in the copy API on POSIX systems has been redesigned. -
Fixed an error that led to an unexpected return of
MDBX_BAD_DBIwhen multiple transactions were started simultaneously within the same process after opening the database. -
Fixed an error that caused the unexpected return of
MDBX_DBS_FULLwhen reopening already open tables and the limit of open DBI descriptors has already been reached. -
Fixed an assembly error for the Android platform when explicitly defining
_FILE_OFFSET_BITS. -
Fixed or deleted several incorrect assert checks, which caused debugging builds to crash in specific situations. Mainly in the code of the functions
txn_end(),txn_lock()andtxn_unlock()on both Windows and POSIX. -
Minor MSVC warnings have been eliminated. Warnings
C5286andC5287are disabled. -
Fixed getting unexpected
SIGBUSdue to delayed/lazy allocation of space in a populated file system after incrementing a DB file. A more detailed explanation is provided in the commit comment.2a7f460345edbeb26a51782cbe6af3c55254ae77. -
Fixed an assert check in the scan path of the DBI-descriptor bitmap, which led to rare crashes of 32-bit debug builds.
-
Redesigned the search for utilities
lib.exeanddlltool.exewhen building using CMake on Windows. -
Fixed crashes when executing Thread-Local-Storage constructors when unloading the library and when there are env instances whose initialization has not been completed.
-
On Windows, the reason for the return of the unexpected error
ERROR_IO_PENDINGin scenarios of multiple opening of one database in one process has been fixed. -
Fixed an issue with auto-tuning parameters when setting geometry with a specified minimum page size, which could cause the page size to increase on machines with a large amount of RAM.
-
In CMake scripts, regression was eliminated, due to which the
ctestinfrastructure did not use the set Valgrind parameters, includingMEMORYCHECK_SUPPRESSIONS_FILE. Now usingctest -D ExperimentalMemCheckdoes not result in multiple false-positive diagnoses. However, to use Valgrind, you still need to build a library with the predefined macroENABLE_MEMCHECK. -
Fixed the use of the identifier
ERROR_UNHANDLED_ERROR, which is not detected in new versions of the Windows SDK. -
Fixed non-closing of DBI descriptors for tables created in nested transactions when such transactions were interrupted.
-
Eliminated unnecessary data synchronization operations with disk when allocating pages when the database is almost full.
-
The
mdbx_loadutility has fixed errors in loading zero-length values and exchanging shrink/growth parameters in the database geometry. -
Fixed a
SIGSEGVcrash when all meta pages are not fully usable. -
Fixed a typo in the condition for determining a change in the size of the database when rolling back a nested transaction.
-
Fixed information collection via
kstat()forbootidon Solaris and related platforms. -
Fixed a typo in the
ST_EXPORTEDprocessing path that broke the build on platforms where the mentioned flag is defined forfstatvfs(). -
Fixed a
SIGSEGVcrash due to an attempt to clean/overwrite a corrupted meta page when opening the database in read-only mode.
English version by liar Google and by Yandex.
v0.14.1 выпуск "Горналь" от 2025-05-05
Первый выпуск в новом кусте/линейке версий с добавлением функционала, расширением API и внутренними переработками.
Благодарности:
- Erigon за спонсорство.
- Alain Picard for support Java bindings and MacOS universal binaries patch for CMake build scenario,
also for bug reporting (put-
MDBX_MULTIPLEregression). Big thank for assistance with debugging and testing. - Alex Sharov за сообщение об ошибках и тестирование.
- Виктору Логунову за сообщение об опечатки в имени переменной в Conan-рецепте.
- Илье Михееву за сообщение о лишнем/ненужном предупреждении несоответствия файла БД новому размеру.
- maxc0d3r for bug reporting and testing.
- Алексею Костюку (aka Keller) за сообщения о проблеме копирования на NFS.
Новое:
-
Переработан код обновления GC и возврата страниц при фиксации транзакций.
Возникающая при этом задача алгоритмически сложна, так как список возвращаемых страниц находится в рекурсивной зависимости от самой процедуры возврата и связанных с этим операций, а прямые решения во многих случаях приводят к многократному росту накладных расходов. Поэтому исторически эта часть кода была запутанным наслоением «сдержек и противовесов», что создавало препятствие для развития. В ходе этой доработки, унаследованный из LMDB код связанный с обновлением GC, был полностью заменен вместе со всеми базирующимися на нём заплатками.
Новая реализация использует контейнеры идентификаторов (aka RKL), комбинирующие внутри списки элементов и непрерывные интервалы, что позволяет предельно сократить накладные расходы и упросить реализацию остальных алгоритмов. Основывается новая реализация на простом прагматичном подходе «резервирования со взвешенным запасом». Для подавляющего подмножества сценариев этого достаточно для однопроходного обновления GC, с общей сложностью от
O(1)для мелких транзакций, доO(log(N))для огромных. При этом реализованный еще в 0.12.1 подход «Big Foot» (дробление больших списков retired-страниц) полностью избавляет GC от потребности в последовательностях смежных/соседствующих страниц и одновременно позволяет работать новому коду обновления GC только по самому простому и быстрому пути.Тем не менее, при намеренном отключении «Big Foot», либо при работы с БД от старых версий движка без «Big Foot», возможны сложные ситуации, когда в GC могут огромные списки страниц, которые желательно дробить при возвращении неиспользованных переработанных остатков. В таких сценариях для возврата в GC требуется создавать больше записей чем было исходно переработано, что может приводить к нехватке имеющихся/переработанных идентификаторов. Тогда в игру вступает следующая часть нового кода, поиск в GC «дыр» (неиспользуемых промежутков/интервалов в пространстве ключей GC). Далее, если свободных идентификаторов (неиспользуемого пространства ключей GC) будет недостаточно, что весьма вероятно в некоторых сценариях, будет решаться задача родственная «укладке рюкзака». В конечном итоге, неиспользованные переработанные страницы будут возвращены в GC, с максимально равномерным распределением/дроблением и использованием имеющихся последовательностей смежных/соседствующих страниц, что гарантирует близость к теоретическому минимуму суммарной стоимости текущих действий и последующих операций.
На данный момент нет известных практических сценариев ведущих к отказу/неуспеху новой реализации обновления GC. Но гипотетически такие случаи возможны, как из-за ошибок/недочетов в реализации, так и из-за использования катастрофически неудачных режимов работы и значений опций (например
MDBX_opt_rp_augment_limit). В текущем понимании, в том числе основываясь на объем тестирования, вероятность проявления ошибок/недочетов оценивается как крайне низкая, а устраняться замеченные проблемы будут по мере обнаружения. Однако, полностью автоматическое решение самых кошмарных и запутанных ситуаций с GC следует ожидать только при реализации дефрагментации — просто потому что нет иного рационального способа решения, за вычетом копирования БД с дефрагментацией. -
Добавлена опция сборки
MDBX_NOSUCCESS_PURE_COMMITпредназначенная для отладки кода пользователя. По-умолчанию опция выключена и при фиксации пустых транзакции возвращаетсяMDBX_SUCCESS. При включении опции, фиксация пишущих транзакций без каких-либо изменений считается нештатным поведением, с возвратом изmdbx_txn_commit()кодаMDBX_RESULT_TRUEвместоMDBX_SUCCESS. Таким образом, у пользователя появляется возможность легко диагностировать лишние/ненужные транзакции записи. -
Добавлена опция сборки
MDBX_ENABLE_NON_READONLY_EXPORTпозволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных в файловых системах доступных извне по NFS будет возвращаться ошибкаMDBX_EREMOTE. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя. -
Поддержка MacOS universal binaries при сборке посредством CMake.
-
Для закрытия или отсоединения всех курсоров с получением их количества в API добавлена функция
mdbx_txn_release_all_cursors_ex(). -
Добавлена операция
MDBX_SEEK_AND_GET_MULTIPLEв API курсора, позволяющая за одну операцию выполнить позиционирование курсора на конкретное значение и начать чтение multi-значений в пакетном режиме. -
Добавлены методы
mdbx::cursor::put_multiple_samelength(),mdbx::cursor::seek_multiple_samelength(),mdbx::cursor_managed::withdraw_handle(). -
В политику управления выделением для
mdbx::buffer<ALLOCATOR, CAPACITY_POLICY>добавлен параметрinplace_storage_size_rounding. Одновременно с этим переработан внутренний union-типmdbx::buffer<ALLOCATOR, CAPACITY_POLICY>::silo::binдля возможности увеличения без пенальти встроенного в экземпляр буфера места под данные. -
Добавлена опция
-c(concise) для включения компактного режима вmdbx_dump, также поддержка таких дампов вmdbx_load. В таких дампах значение ключей сохраняются однократно (не повторяются), что может существенно уменьшать результирующий объём для таблиц с multi-значениями (aka dupsort). Однако, компактные дампы не совместимы с форматом ожидаемым/поддерживаемым в Berkeley Database и LMDB. -
В API добавлена функция
mdbx_cursor_close2()возвращающая код ошибки. -
В chk-функционал добавлена гистограмма количества multi-значений/дубликатов. При использовании утилиты
mdbx_chk, для получения соответствующей (и массы другой) информации, достаточно увеличить детализацию несколько раз использовав опцию-v.
Изменение поведения:
-
Теперь при вставке данных в dupsort-таблицу CoW копирование целевых страниц выполняется после проверки отсутствия добавляемого значения среди уже присутствующих multi-значений (aka дубликатов). В результате вставка уже присутствующих "дубликатов" не приводит к каким-либо изменениям в БД и принципиально увеличивает производительность в таких сценариях. В текущем понимании, добавленная проверка не приводит к заметному увеличению накладных расходов и, как следствие, не приводит к снижению производительности в сценариях с обычным/регулярным обновлением и/или вставкой данных.
-
Использование системного кода ошибки
EREMOTEIO("Remote I/O error") вместоENOTBLK("Block device required") в качествеMDBX_EREMOTEдля индикации ошибочной ситуации открытия БД расположенной на сетевом носителе. -
Функция
mdbx_txn_release_all_cursors()возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров. Для аналогичных действий с получением количества закрытых курсоров в API добавлена функцияmdbx_txn_release_all_cursors_ex(). -
Поддержка пустого набора данных в put-операции
MDBX_MULTIPLEради упрощения пользовательского кода, какой-либо модификации данных в БД при этом не происходит. -
Для основных вариантов использования шаблона
mdbx::buffer<>теперь явно инстанцируются внутри библиотеки, одновременно соответствующие специализации шаблона помечены какexternalдля предотвращения повторного инстанцирования в пользовательском коде. -
Запрещена отвязка/открепление курсоров во вложенных транзакциях, т.е. вызовы
mdbx_cursor_unbind()иmdbx_txn_release_all_cursors(unbind=true)для курсоров открытых в одной из родительских транзакций. Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения. -
В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вывоза
mdbx::cursor::txn(). -
При невозможности отвязки курсора от его текущей транзакции функция
mdbx_cursor_bind()теперь возвращаетMDBX_EINVALвместоMDBX_BAD_TXN.
Исправления:
-
Для совместимости с GCC 15.x в режиме C23 изменен порядок указания атрибутов функций.
-
Устранён регресс допускающий SIGSEGV в операциях обновления после вытеснения/spilling страниц в больших транзакциях. Ошибка присутствует в выпусках v0.13.1, v0.13.2, v0.13.3 и оставалась незамеченной из-за специфических условий и низкой вероятности проявления. Более подробная информация в описании коммита
cb8eec6d11cdab4f7d3cf87913e8009149dcf60b. -
Устранено лишнее/ненужное предупреждение в сценарии изменения размера БД посредством вызова
mdbx_env_set_geometry()до её открытия. API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием, чтобы избежать как лишних накладных расходов, так и потенциальных ошибок из-за нехватки адресного пространства. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен. -
Восстановлена доступность дескрипторов таблиц, открытых в дочерней транзакции, после её фиксации, в случае отсутствия изменений в данных. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
e6af7d7c53428ca2892bcbf7eec1c2acee06fd44от 2023-11-05. -
Устранён сбой аудита таблиц при инвалидации дескрипторов таблиц вследствие отмены вложенной транзакции. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
e6af7d7c53428ca2892bcbf7eec1c2acee06fd44от 2023-11-05. -
Устранена причина потенциальных сбоев и/и деградации производительности в сценарии закрытия курсора до завершения вложенной транзакции, с последующим изменением данных той-же таблицы в текущей вложенной транзакции, либо её дочерних транзакциях. Проблема обнаружена при ручном анализе кода, сценарии воспроизведения/проявления проблемы пока не известны. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
3de3d425a128a3c6f7866503f5f93b80c09dbe41от 2024-05-19. -
Устранена причина ложных ошибок при работе
mdbx_chkс высоким уровнем логирования. Проблема возникала из-за неверной трактовкиMDBX_NOTFOUNDпри штатном окончании итерируемых данных. -
Устранена причина попыток рекурсивного захвата мьютекса при работе
mdbx_chk -wв сборах с поддержкой Valring/ASAN и под управлением этих инструментов. -
Устранена вероятность ситуации гонки в
tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP)при работе в разных потоках. В реальных сценариях вероятность проявления проблемы была близка к нулю. Для подробностей смотрите комментарий коммита3e91500fac475947f5b58268d5edd3c9cc4f77f6. -
Устранён регресс затенения курсоров во вложенных транзакциях. При реализации отложенной/ленивой инициализации dbi-дескрипторов также было реализовано отложенное затенение курсоров (создание копии состояния для отката при прерывании транзакции), что существенно уменьшало накладные расходы при старте и завершении вложенных транзакций в сценариях с большим количеством курсоров. Однако, была допущена логическая ошибка, вследствие которой отложенная инициализация и затенение выполнялись при использовании dbi-дескрипторов, но не курсора открытого в родительской транзакции. В результате, родительские курсоры во вложенных транзакциях могли не затеняться, что приводило к неконсистентному состоянию в случае прерывания/откате вложенной транзакции и в соответствующей таблицы были изменения в рамках прерванной вложенной транзакции. Проблема не реализовывалась в тестовых сценариях и не была замечена при эксплуатации, но была обнаружена при расширении тестов. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
e6af7d7c53428ca2892bcbf7eec1c2acee06fd44от 2023-11-05. -
Устранён регресс в пути обработки операции
MDBX_MULTIPLE. Пакетная вставка значений посредствомMDBX_MULTIPLEмогла приводить к падениям и повреждению структуры БД. Ошибка оставалось не замеченной из-за специфических условий проявления, которые не реализовались в тестах. Проблема присутствовала во всех выпусках начиная с v0.13.1, но соответствующая ошибка не связана с конкретным коммита в истории, а является следствием нескольких доработок (шагов рефакторинга), которые суммарно привели к регрессу. Технически ошибка обусловлена не-обнулением переменной, чего не происходило в некотором пути выполнения, так как исходно не требовалось. Однако, такое обнуление потребовалось после ряда этапов оптимизации и рефакторинга смежных участков кода. Для подробностей смотрите комментарий коммита23a417fe19614481c6546845995d6dc845baf797. -
Скорректировано описание ошибки
MDBX_MVCC_RETARDEDи текста соответствующего сообщения. -
В C++ API добавлена упущенная проверка
__cpp_concepts >= 202002для использования концептов C++. -
Устранён регресс при использовании курсоров для DBI=0 в читающих транзакциях.
После рефакторинга и ряда оптимизаций для завершения/гашения курсоров в читающих и пишущих транзакций стал использоваться общий код. Причем за основу, был взят соответствующий фрагмент относящийся к пишущим транзакциям, в которых пользователю не позволяется использоваться курсоры для DBI=0 и поэтому эта итераций пропускалась.
В результате, при завершении читающих транзакциях, курсоры связанные с DBI=0 не завершались должным образом, а при их повторном использовании или явном закрытии после завершения читающей транзакции происходило обращение к уже освобожденной памяти. Если же такие курсоры отсоединялись или закрывались до завершения читающей транзакции, то ошибка не имела шансов на проявление.
-
Устранён регресс в виде ошибки
EAGAINпри копировании БД на NFS и CIFS/SMB.При доработках/развитии API в функции копирования был добавлен захват файловой блокировки посредством как
fcntl(), так иflock(). Однако, в зависимости от версии локального ядра, версии удалённого сервера NFS и опций монтирования, это могло приводить к возврату POSIX-ошибкиEAGAIN(11на большинстве платформ, включая Linux). -
Устранена ошибка merge/rebase внутри
mdbx_txn_release_all_cursors_ex(), что могло приводить к последующим неожиданным ошибкамMDBX_EBADSIGNи утечкам памяти. Для проверки сценария дополнен соответствующий тест. -
Исправлена assert-проверка в пути завершения вложенных транзакций. Для проверки сценария дополнен соответствующий тест.
-
Устранена возможность возврата неожиданной ошибки
MDBX_BUSYизmdbx_txn_lock(dont_wait=false).
Прочие доработки:
-
Существенный рефакторинг с реструктуризацией кода, переименованием внутренних структур, их полей и внутренних функций.
-
Доработка использования LTO в CMake-сценариях: использование
-flto=autoдля GCC >= 11.4, расслабление условий для включения LTO для CLANG на Linux, расширение поискаLLVMgold.soв относительных lib-директориях. -
Добавлены дополнительные проверки сигнатур курсоров при итерации связанных списков.
-
Кратное сокращение итераций тестов в зависимости от конфигурации Valgrind/Debug/CI.
-
Устранены предупреждения UBSAN о невыравненном доступе в тесте extra/close-dbi.
-
Добавлен перехват и логирование исключений в extra-тестах на C++.
-
Расширены тесты extra/dupfix-multiple, extra/cursor-closing и extra/txn.
-
В утилиту тестирования добавлена поддержка режима/опции
MDBX_VALIDATIONи поддержка значенийon/offдля опций командной строки. -
Добавлены doxygen-описания для doubtless-positioning констант.
-
Переработана проверка курсоров на входе в API-функций с добавлением
cursor_check(),cursor_reset()иcursor_drown(). -
Отключено использование C23
[[атрибутов]]для версий CLANG меньше 20. -
Во избежание потенциальных проблем отключено использование
copy_file_range()на ядрах Linux 5.3 - 5.18. -
Вброс
std::invalid_argumentтеперь производится явным сообщениемMDBX_EINVAL.
v0.14.0 от 2025-01-13
Технический тэг, отмечающий начало ветки 0.14
с новым функционалом и изменением API.
Запланированные новые возможности 0.14:
-
Ранняя (не-отложенная) очистка GC и рефакторинг обновления GC. Самостоятельной видимой для пользователя ценности не имеет, но требуется для последующих пунктов. Будет реализовано в 0.14.1.
-
Явная дефрагментация БД. В API будет добавлена функция с двумя парами параметров:
- минимальный (требуемый) объём дефрагментации (уменьшения БД) и минимальное время, которое следует потратить;
- максимальный (ограничивающий) объём дефрагментации и максимальной время, которое допустимо потратить.
Упрощенно, алгоритмически явная дефрагментация сводится к сканированию b-tree с формированием списка страниц расположенных близко к концу БД, а затем копирование этих страниц в не-используемые, но расположенные ближе к началу БД. В результате, после фиксации дефрагментирующей транзакции оригиналы скопированных страниц становятся не-используемыми, а размер БД может быть уменьшен за счет отсечения ни-используемых страниц в конце используемого пространства. Будет реализовано в 0.14.2.
-
Нелинейная переработка GC, без остановки переработки мусора на старом MVCC-снимке используемом долгой транзакцией чтения.
После реализации запланированного, любая длительная читающая транзакция по-прежнему будет удерживать от переработки используемый/читаемый MVCC-снимок данных (все образующие его страницы БД), но позволит перерабатывать все неиспользуемые MVCC-снимки, как до читаемого, так и после. Это позволит устранить один из основных архитектурных недостатков унаследованных от LMDB и связанных с ростом размера БД пропорционально объёму производимых изменений данных на фоне долго работающей транзакции чтения.
Будет реализовано предположительно в 0.14.3, 0.14.4 или даже в 0.15.x. Перенос в 0.15.x оправдан возможностью переноса функционала дефрагментации в stable-ветку, но посмотри как пойдут дела.
v0.13.12 "Аврора" (Aurora) at 2026-04-30
The supporting release of a stable branch with bug fixes.
Appreciations:
- Erigon for sponsorship.
- Chloe Cano for fuzzing, bug reporting and fixes.
- Weixie Cui for bug fixing through pull-requests.
- Alexander Kelchin (Serebrium Company) for bug reporting and prototypes of exploits.
Fixes:
-
Fixed the counting of nested trees in the
mdbx_chktool for a multi-values/dupsort hives (backport). -
Fixed swapping the shrink/growth parameters in a DB-geometry in the
mdbx_loadutility (backport). -
Fixed
SIGSEGVin the case when all meta pages are not entirely usable (backport). -
Fixed information collection via
kstat()for bootid on Solaris and related platforms (backport). -
Fixed a typo in the
ST_EXPORTEDprocessing path that broke the build on platforms where the mentioned flag is defined forfstatvfs()(backport). -
Fixed missing error handling of
NtUnmapViewOfSection()andmunmap()insideosal_munmap()(backport). -
Fixed
SIGSEGVdue to an attempt to clean/overwrite a corrupted meta page when opening the database in read-only mode (backport). -
Fixed returning a wrong/uninitialized
ms_psizefield when usingmdbx_enumerate_tables()(backport). -
Fixed adjusting of neighbor nested cursors after a dupsort item deletion (backport).
Other:
-
The dumps generated by the
mdbx_dumputility no longer contains the current size of a DB andmaxreadersparameter, so that the contents of a dump depend only on a payload data. -
Cutoff
packages/into the separate aside repository.
v0.13.11 "A7A5" (just as Stable) at 2026-01-30
The supporting release of a stable branch with bug fixes.
Appreciations:
- Erigon for sponsorship.
- Cosmin Apreutesei for bug reporting.
- Igor Ikonopistsev for NodeJS bindings.
- Anatoly Zhmur for reporting bugs.
Important:
-
libmdbx project has changed its code development and distribution model. To get acquainted with important changes and plans, we recommend reading the compact presentation "libmdbx: successes, obstacles, goals and roadmap", which contains important explanations in the form of embedded comments.
-
At a many requests of users, the change log now is kept in English.
Fixes:
-
Fixed using of the identifier
ERROR_UNHANDLED_ERROR, which is not defined in new versions of Windows SDK. -
Fixed non-closing of DBI descriptors for tables created in nested transactions when such transactions are aborted.
-
Fixed MSVC warning C4324 for
buffer::silo::bin. -
Added workaround for MinGW build failures of dll-enabled C++ API.
-
Fixed extra msync/fsync operations during GC reclaiming in a full database.
-
Fixed suboptimal reducing/merging of histogram items in an output of the
mdbx_chktool. -
Added backlog-adjustment trick to avoid extra-growth of DB instead of reclaim GC in a rare specific cases. In the 0.14.x version series, this mechanism has been completely updated. However, for version 0.13.11, this inelegant modification done in order to reduce the risk of regression.
-
Minor fixed
iov_callback4dirtypages()and assertion insidecursor_put()to avoid Valgrind/ASAN warnings. -
Fixed cursor(s) finalization after ones explicitly closed in a nested transactions.
Other:
-
Clarification and addition of documentation.
-
Considering extended ASCII as non-printable if UTF8 enabled in C++ API.
-
Using hex dump of
mdbx::sliceinstead of base58 in C++ API. -
Added link to
mdbxmoubindings for NodeJS.
v0.13.10 "Блеск Славы" (Gloss of Glory) от 2025-12-17
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, в память о Майкле Глоссе (Michael Alexander Gloss, American, son of Deputy Director of the CIA) героически погибшем в поисках справедливости за светлые идеалы человечества и посмертно награждённом Орденом Мужества.
Благодарности:
- Erigon за спонсорство.
Важное:
-
Проект libmdbx полностью перемещен в юрисдикцию Российской Федерации. Пожалуйста обращайтесь на https://libmdbx.dqdkfa.ru за документацией и на https://sourcecraft.dev/dqdkfa/libmdbx за исходным кодом (он по-прежнему открыт и обеспечен первоклассной бесплатной поддержкой).
-
Каких-либо существенных ошибок/недочетов влияющих на стабильность и/или эксплуатационные качества не обнаружено.
Исправления:
-
Устранение предупреждения
unused function 'osal_yield()'от новых версий CLANG при сборке амальгамированного исходного кода и при компиляции в режиме одного объектного модуля. -
Для Linux добавлено предотвращение проявления ошибки в реализации fast_commit файловой системы Ext4.
-
Устранено падение при выполнении Thread-Local-Storage конструкторов при выгрузке библиотеки и наличия экземпляров env, инициализация которых не была завершена.
-
На Windows устранена причина возврата неожиданной ошибки
ERROR_IO_PENDINGв сценариях множественного открытия одной БД в одном процессе. -
Исправлен недочёт автоподстройки параметров при установке геометрии с заданным минимальным размером страницы, из-за которого на машинах с большим количеством ОЗУ размер страницы мог увеличиваться.
-
В CMake-скриптах устранён регресс, из-за которого инфраструктура
ctestне использовала задаваемые параметры Valgrind, в том числеMEMORYCHECK_SUPPRESSIONS_FILE. Теперь использованиеctest -D ExperimentalMemCheckне приводит к множественной ложно-положительной диагностики. Однако, для использования Valgrind по-прежнему необходимо собирать библиотеку с предопределением макроcаENABLE_MEMCHECK. -
В тестах устранено несколько несущественных утечек памяти и предупреждение UBSAN о вызове
memcmp(, length = 0).
Прочие доработки:
-
Переработка реализации буферов и другие доработки в C++ API.
-
Для предотвращения неожиданных ошибок при сборке, в CMake-скрипты добавлена очистка исходного кода от файлов с именами совпадающими с генерируемыми в сборочной директории.
-
Устранено ложное предупреждение некоторых компиляторов о возможном использовании неинициализированной переменной внутри
env::get_path(). -
Во внутренней информации о сборке обеспечена поддержка сведений о RISC-V и Harmony OS.
-
Расширен набор тестов, cmake-тесты дополнены сценариями запуска
mdbx_copy. -
При сборке посредством GNU Make и CMake теперь, вместо одного
config.h, генерируются разные файлыconfig-gnumake.hиconfig-cmake.h.
v0.13.9 "ИС-2" (IS-2) от 2025-10-31
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов. Выпуск назван в память о cамом мощном тяжелом советском танке "ИС-2", который был принят на вооружение 31 октября 1943 года в разгар Великой Отечественной Войны и долгое время оставался одной из сильнейших машин мира в категории по массе 40—50 тонн.
Благодарности:
- Erigon за спонсорство.
Исправления:
-
Исправлена assert-проверка в пути сканирования битовой карты DBI-дескрипторов приводившая к редким падениям 32-битных отладочных сборок.
-
Переделан поиск утилит
lib.exeиdlltool.exeпри сборке посредством CMake на Windows. -
Устранён регресс проявлявшийся увеличением (не-уменьшением) размера БД, после добавления использования
fallocate()ради предотвращения SIGBUS при нехватке места в файловой системе где расположена БД. -
Устранена опечатка в тестовом скрипте
test/battery-tmux.shприводящая к созданию мусорного файла с именем-. -
Удалено лишнее/ненужное использование макроса
MDBX_INTERNALоставшееся после рефакторинга. -
Для Android добавлен обход (workaround) для уменьшения вероятности системной ошибки
EAGAINвозникающей из-за нехватки системных ресурсов и переходных процессов при закрытии и быстром повторном открытии БД.
Прочие доработки:
- Поддержка Harmony OS (OHOS).
v0.13.8 "Всеобуч" (v'seabooch) от 2025-08-31
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, в день 100 летнего юбилея Постановления Всероссийского центрального исполнительного комитета о всеобщем бесплатном начальном образовании.
Благодарности:
- Erigon за спонсорство.
Исправления:
- Устранена возможность получения неожиданного
SIGBUSиз-за отложенного/ленивого выделение места в заполненной файловой системе после приращения файла БД. Более подробное пояснение в комментарии коммита2930b304dc674bbccd188b7ce7c3f83755ef706e.
Изменение поведения:
-
Вновь включена/разрешена на старых ядрах Linux, начиная с версии 3.16, так как сейчас уже нет причин отказываться от работы на 3.16 поддерживая при этом ядра 4.x, и еще есть проекты (Isar, Isar-Community, Hive) которым требуется такая поддержка.
-
Ошибка
MDBX_WANNA_RECOVERYпри открытии БД в режиме только-чтение теперь возвращается если размер БД не кратен размеру системной страницы, но игнорируется не кратность размеру блока выделения виртуальной памяти. Этим устраняется регресс, проявившейся вследствие изменения поведения после задействования системного вызоваfallocate()для предотвращенияSIGBUSпосле приращения файла БД в заполненной файловой системе.
v0.13.7 "Дружба" (Friendship) от 2025-07-30.
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, в международный день дружбы.
Благодарности:
- Erigon за спонсорство.
- Артёму Воротникову за сообщение об ошибках и тестировании призязок для Rust.
Исправления:
-
Устранена критическая ошибка в функционале
mdbx_env_resurrect_after_fork()при использовании SysV-семафоров.Проявлялась ошибка только после порождения дочернего процесса посредством
fork()на фоне выполняющейся пишущей транзакции, что приводило к неверной работе семафоров и далее к самым различным ошибкам, вплоть до повреждения БД. Проблема существовала начиная с появленияmdbx_env_resurrect_after_fork()и затрагивала OSX, а также POSIX-платформы при сборке с опциейMDBX_LOCKING=5. -
Устранена проблема в API копирования БД на отличных от Linux системах POSIX, а также в некоторых случаях при расположении целевого файла на не-локальной файловой системе. Проблема проявлялась в основном на OSX, возвратом ошибки
EWOULDBLOCK/EAGAIN(35), что обусловлено недочетом/конфликтом блокировокfcntl(F_SETLK)иflock()в ядре ОС. Переработана обработка ошибок захвата файловых блокировок в API копирования на системах POSIX. -
Устранена ошибка приводившая к неожиданному возврату
MDBX_BAD_DBIпри одновременном старте нескольких транзакций внутри одного процесса после открытия БД. -
Устранена ошибка приводившая к неожиданному возврату
MDBX_DBS_FULLпри повторном открытии уже открытых таблиц и уже достигнутом лимите открытых DBI-дескрипторов. -
Исправлена ошибка сборки для платформы Android при явном определении
_FILE_OFFSET_BITS. -
Исправлена ошибка использования
ENOMEMвместоMDBX_ENOMEM. Что могло ломать сборку на не-POSIX/Windows платформах, в зависимости от конфигурации и/или версии SDK. -
Поправлено либо удалено несколько неверных assert-проверок, из-за которых происходили падения отладочных сборок в специфических ситуациях. Главным образом, в коде функций
txn_end(),txn_lock()иtxn_unlock()как на Windows, так и на POSIX. -
Устранены несущественные предупреждения MSVC. Отключены предупреждения
C5286иC5287.
Прочие доработки:
-
Доработана логика отказа от использования OFD-блокировок на POSIX-платформах. Теперь кроме
EINVALучитываются дополнительные коды ошибок (ENOSYS,ENOIMPL,ENOTSUP,ENOSUPP,EOPNOTSUPP), что позволит работать собранной библиотеке в некоторых случаях, когда актуальное ядро/контейнер/эмулятор не поддерживает требуемых системных вызовов. -
В тестовый фреймворк добавлена поддержка опции --numa # для привязки стохастического теста к NUMA-узлу, а в battery/tmux-скрипте добавлено явное распределение по NUMA-узлам, что существенно увеличило КПД при тестировании на NUMA-машинах.
-
В стохастическом скрипте реализован случайный порядок запуска отдельных тестов.
v0.13.6 "Бузина" от 2025-04-22
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, в память о погибшем украинском историке и писателе Алесе Бузине.
Благодарности:
- Erigon за спонсорство.
- Илье Михееву и команде Erigon за сообщения о проблеме и тестирование.
- Алексею Костюку (aka Keller) за сообщения о проблеме копирования на NFS.
Исправления:
-
Устранён регресс при использовании курсоров для DBI=0 (aka GC/FreeDB) в читающих транзакциях.
После рефакторинга и ряда оптимизаций для завершения/гашения курсоров в читающих и пишущих транзакций, стал использоваться общий код. Причем за основу, был взят соответствующий фрагмент относящийся к пишущим транзакциям, в которых пользователю не позволяется использоваться курсоры для DBI=0 и поэтому эта итераций пропускалась.
В результате, при завершении читающих транзакциях, курсоры связанные с DBI=0 не завершались должным образом, а при их повторном использовании или явном закрытии после завершения читающей транзакции происходило обращение к уже освобожденной памяти. Если же такие курсоры отсоединялись или закрывались до завершения читающей транзакции, то ошибка не имела шансов на проявление.
-
Устранён регресс в виде ошибки
EAGAINпри копировании БД на NFS и CIFS/SMB.При доработках/развитии API в функции копирования был добавлен захват файловой блокировки посредством как
fcntl(), так иflock(). Однако, в зависимости от версии локального ядра, версии удалённого сервера NFS и опций монтирования, это могло приводить к возврату POSIX-ошибкиEAGAIN(11на большинстве платформ, включая Linux). -
Устранена ошибка merge/rebase внутри
mdbx_txn_release_all_cursors_ex(), что могло приводить к последующим неожиданным ошибкамMDBX_EBADSIGNи утечкам памяти. Для проверки сценария дополнен соответствующий тест. -
Исправлена assert-проверка в пути завершения вложенных транзакций. Для проверки сценария дополнен соответствующий тест.
-
Устранена возможность возврата неожиданной ошибки
MDBX_BUSYизmdbx_txn_lock(dont_wait=false). -
Для совместимости с GCC 15.x в режиме C23 изменен порядок указания атрибутов функций.
Изменение поведения:
- При невозможности отвязки курсора от его текущей транзакции функция
mdbx_cursor_bind()теперь возвращаетMDBX_EINVALвместоMDBX_BAD_TXN.
Прочие доработки:
-
Во избежание потенциальных проблем отключено использование
copy_file_range()на ядрах Linux 5.3 - 5.18. -
Вброс
std::invalid_argumentтеперь производится явным сообщениемMDBX_EINVAL. -
Уточнен тип адреса для пожертвований. Ethereum/ERC-20 позволяет перечислять не только ETH, но и другие валюты/токены, в том числе USDC.
-
Дополнен тест курсоров extra/cursor-closing.
-
В
NOTICEобновлена информация о GitHub.
v0.13.5 "Труба" от 2025-03-21
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов.
Благодарности:
- Erigon за спонсорство.
- Илье Михееву за сообщения о недочетах и тестирование.
- Alex Sharov за сообщение об ошибках и тестирование.
- maxc0d3r for bug reporting and testing.
- Alain Picard for support Java bindings and MacOS universal binaries patch for CMake build scenario,
also for bug reporting (put-
MDBX_MULTIPLEregression). Big thank for assistance with debugging and testing.
Новое:
-
Добавлена опция сборки
MDBX_ENABLE_NON_READONLY_EXPORTпозволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных файловых системах доступных извне по NFS будет возвращаться ошибкаMDBX_EREMOTE. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя. -
Поддержка MacOS universal binaries при сборке посредством CMake.
-
Для закрытия или отсоединения всех курсоров с получением их количества в API добавлена функция
mdbx_txn_release_all_cursors_ex(). -
Добавлена операция
MDBX_SEEK_AND_GET_MULTIPLEв API курсора, позволяющая за одну операцию выполнить позиционирование курсора на конкретное значение и начать чтение multi-значений в пакетном режиме. -
Добавлены методы
mdbx::cursor::put_multiple_samelength(),mdbx::cursor::seek_multiple_samelength(),mdbx::cursor_managed::withdraw_handle(). -
В политику управления выделением для
mdbx::buffer<ALLOCATOR, CAPACITY_POLICY>добавлен параметрinplace_storage_size_rounding. Одновременно с этим переработан внутренний union-типmdbx::buffer<ALLOCATOR, CAPACITY_POLICY>::silo::binдля возможности увеличения без пенальти встроенного в экземпляр буфера места под данные. -
В API добавлена функция
mdbx_cursor_close2()возвращающая код ошибки.
Исправления:
-
Устранение лишнего/ненужного предупреждения в сценарии изменения размера БД посредством вызова
mdbx_env_set_geometry()до её открытия. API предусматривает возможность запросить изменение геометрии/размера БД перед её открытием, чтобы избежать как лишних накладных расходов, так и потенциальных ошибок из-за нехватки адресного пространства. В этом сценарии ранее могло выдаваться лишнее/ненужное предупреждение о несоответствии файла БД новому размеру. Теперь этот недостаток исправлен. -
Восстановлена доступность дескрипторов таблиц, открытых в дочерней транзакции, после её фиксации, в случае отсутствия изменений в данных. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
e6af7d7c53428ca2892bcbf7eec1c2acee06fd44от 2023-11-05. -
Устранён сбой аудита таблиц при инвалидации дескрипторов таблиц вследствие отмены вложенной транзакции. Проблема не была замечена ранее из-за специфического сценария проявления. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
e6af7d7c53428ca2892bcbf7eec1c2acee06fd44от 2023-11-05. -
Устранена причина потенциальных сбоев и/и деградации производительности в сценарии закрытия курсора до завершения вложенной транзакции, с последующим изменением данных той-же таблицы в текущей вложенной транзакции, либо её дочерних транзакциях. Проблема обнаружена при ручном анализе кода, сценарии воспроизведения/проявления проблемы пока не известны. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
3de3d425a128a3c6f7866503f5f93b80c09dbe41от 2024-05-19. -
Устранена причина ложных ошибок при работе
mdbx_chkс высоким уровнем логирования. Проблема возникала из-за неверной трактовкиMDBX_NOTFOUNDпри штатном окончании итерируемых данных. -
Устранена причина попыток рекурсивного захвата мьютекса при работе
mdbx_chk -wв сборах с поддержкой Valring/ASAN и под управлением этих инструментов. -
Устранены проверки потока владеющего транзакцией при сборке с опцией
MDBX_TXN_CHECKOWNER=OFF. -
Устранена вероятность ситуации гонки в
tbl_setup(MDBX_DUPFIXED | MDBX_INTEGERDUP)при работе в разных потоках. В реальных сценариях вероятность проявления проблемы была близка к нулю. Для подробностей смотрите комментарий коммита3e91500fac475947f5b58268d5edd3c9cc4f77f6. -
Устранён регресс затенения курсоров во вложенных транзакциях. При реализации отложенной/ленивой инициализации dbi-дескрипторов также было реализовано отложенное затенение курсоров (создание копии состояния для отката при прерывании транзакции), что существенно уменьшало накладные расходы при старте и завершении вложенных транзакций в сценариях с большим количеством курсоров. Однако, была допущена логическая ошибка, вследствие которой отложенная инициализация и затенение выполнялись при использовании dbi-дескрипторов, но не курсора открытого в родительской транзакции. В результате, родительские курсоры во вложенных транзакциях могли не затеняться, что приводило к неконсистентному состоянию в случае прерывания/откате вложенной транзакции и в соответствующей таблицы были изменения в рамках прерванной вложенной транзакции. Проблема не реализовывалась в тестовых сценариях и не была замечена при эксплуатации, но была обнаружена при расширении тестов. Ошибка присутствует в версиях 0.13.x и последующих, начиная с коммита
e6af7d7c53428ca2892bcbf7eec1c2acee06fd44от 2023-11-05. -
Устранён регресс в пути обработки операции
MDBX_MULTIPLE. Пакетная вставка значений посредствомMDBX_MULTIPLEмогла приводить к падениям и повреждению структуры БД. Ошибка оставалось не замеченной из-за специфических условий проявления, которые не реализовались в тестах. Проблема присутствовала во всех выпусках начиная с v0.13.1, но соответствующая ошибка не связана с конкретным коммита в истории, а является следствием нескольких доработок (шагов рефакторинга), которые суммарно привели к регрессу. Технически ошибка обусловлена не-обнулением переменной, чего не происходило в некотором пути выполнения, так как исходно не требовалось. Однако, такое обнуление потребовалось после ряда этапов оптимизации и рефакторинга смежных участков кода. Для подробностей смотрите комментарий коммита23a417fe19614481c6546845995d6dc845baf797. -
Скорректировано описание ошибки
MDBX_MVCC_RETARDEDи текста соответствующего сообщения. -
В C++ API добавлена упущенная проверка
__cpp_concepts >= 202002для использования концептов C++.
Изменение поведения:
-
Функция
mdbx_txn_release_all_cursors()возвращает только код ошибки, не смешивая его с количеством обработанных/закрытых курсоров. Для аналогичных действий с получением количества закрытых курсоров в API добавлена функцияmdbx_txn_release_all_cursors_ex(). -
Использование системного кода ошибки
EREMOTEIO("Remote I/O error") вместоENOTBLK("Block device required") в качествеMDBX_EREMOTEдля индикации ошибочной ситуации открытия БД расположенной на сетевом носителе. -
Для основных вариантов использования шаблона
mdbx::buffer<>теперь явно инстанцируются внутри библиотеки, одновременно соответствующие специализации шаблона помечены какexternalдля предотвращения повторного инстанцирования в пользовательском коде. -
Запрещена отвязка/открепление курсоров во вложенных транзакциях, т.е. вызовы
mdbx_cursor_unbind()иmdbx_txn_release_all_cursors(unbind=true)для курсоров открытых в одной из родительских транзакций. Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения. -
В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вызова
mdbx::cursor::txn().
Прочие доработки:
-
Доработка использования LTO в CMake-сценариях: использование
-flto=autoдля GCC >= 11.4, расслабление условий для включения LTO для CLANG на Linux, расширение поискаLLVMgold.soв относительных lib-директориях. -
Добавлены дополнительные проверки сигнатур курсоров при итерации связанных списков.
-
Кратное сокращение итераций тестов в зависимости от конфигурации Valgrind/Debug/CI.
-
Устранены предупреждения UBSAN о невыравненном доступе в тесте extra/close-dbi.
-
Добавлен перехват и логирование исключений в extra-тестах на C++.
-
Расширены тесты extra/dupfix-multiple, extra/cursor-closing и extra/txn.
-
В утилиту тестирования добавлена поддержка режима/опции
MDBX_VALIDATIONи поддержка значенийon/offдля опций командной строки. -
Добавлены doxygen-описания для doubtless-positioning констант.
-
Переработана проверка курсоров на входе в API-функций с добавлением
cursor_check(),cursor_reset()иcursor_drown(). -
Отключено использование C23
[[атрибутов]]для версий CLANG меньше 20.
v0.13.4 "Sigma Boy" от 2025-02-14
Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов.
Благодарности:
- Erigon за спонсорство.
- Алексею Костюку (aka Keller) за сообщения об ошибках и недочетах.
- Alain Picard for support Java bindings and MacOS universal binaries patch for CMake build scenario.
- Alex Sharov за сообщение об ошибках и тестирование.
- Виктору Логунову за сообщение об опечатки в имени переменной в Conan-рецепте.
Новое:
- Поддержка MacOS universal binaries при сборке посредством CMake.
Исправления:
-
Устранён регресс допускающий SIGSEGV в операциях обновления после вытеснения/spilling страниц в больших транзакциях. Ошибка присутствует в выпусках v0.13.1, v0.13.2, v0.13.3 и оставалась незамеченной из-за специфических условий и низкой вероятности проявления. Более подробная информация в описании коммита
21630ea115690a5cb39cfa921f9d199271a08102. -
Исправлена опечатка в документации в упоминании
mdbx_env_resurrect_after_fork(). -
Исправлена опечатка в условном операторе внутри
cursor_touch(). При переделке курсоров было пропущено отрицание в условии, при оценке количества страниц, которые могут потребоваться для выполнения операции. В текущем понимании ошибка не приводила к каким-либо проблемам, ибо оценка делает по верхней границе с существенным запасом, а в худшем случае это могло приводить к прерыванию транзакции из-за достижения ограничения на кол-во грязных страниц. -
Корректировка излишне строгого условия в assert-проверке внутри
recalculate_subpage_thresholds(). Ошибка могла проявляться только в отладочных сборках при выставлении определенной комбинации предельных значений опцийMDBX_opt_subpage_limit,MDBX_opt_subpage_room_threshold,MDBX_opt_subpage_reserve_prereq,MDBX_opt_subpage_reserve_limit. -
Исправление опечатки в Conan-рецепте в коде протокольно-отладочного вывода в имени переменной
version_json_pathname.
v0.13.3 "Королёв" от 2025-01-12
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов в день рождения и в память об Серге́е Па́вловиче Королёве, советском учёном и Главном конструкторе ракетно-космических систем.
Одновременно с этим релизом:
- Ветка
0.12.xперестаёт поддерживаться и отправляется вархив/0.12. - Ветка
0.13.xполучает статус стабильной и вливается вstable.
Благодарности:
- Алексею Костюку (aka Keller) за сообщения об ошибках и недочетах.
- Erigon за спонсорство.
- Lazymio за новые привязки к Python.
Новое:
-
В C API добавлена функция
mdbx_cursor_count_ex()позволяющая получить как количество мульти-значений соответствующих текущему ключу, так и информацию о вложенном дереве хранящем эти значения. -
В C++ API добавлен метод
mdbx::txn::make_broken()аналогичныйmdbx_txn_break(). -
В утилиты mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load, mdbx_stat добавлено логирование ошибок, предупреждений и важных сообщений от libmdbx.
Исправления:
-
Устранён регресс неразблокировки мьютекса при попытки повторного закрытия dbi-дескриптора, в том числе при попытке явно закрыть дескриптор после удаления связанной с ним таблицы.
Вместо возврата ошибки
MDBX_BAD_DBIпроисходил выход из тела функции по успешному пути, но без освобождения захваченной блокировки. Ошибка была внесена 2024-10-23 коммитом3049bb87b5b14d83b16d121c186ce8fb3f21383e. -
Устранён регресс состояния вложенного/dupsort курсора после вставки данных в
MDBX_APPEND-режиме.При добавлении нового ключа в append-режиме, в случае когда в текущей (последней) позиции с ключом связаны несколько значений и (соответственно) вложенный dupsort-курсор инициализирован, вставка происходила без сброса вложенного курсора.
В результате вложенный курсор логически оставался стоять на multivalue-данных связанных с предыдущей позицией основного курсора, т.е. переходил в неконсистентное состояние.
Ошибка проявлялась возвратом неверных значений из
mdbx_cursor_count()или срабатывание assert-проверки в отладочных сборках. -
Поддержка получения boot_id при работе внутри LXC-контейнера.
Из LXC-контейнера не доступен файл хостовой системы
/proc/sys/kernel/random/boot_id. Вместо него, при каждом старте контейнера, создается и заполняется случайными данными собственный boot_id смонтированный через bind изtmpfs. https://github.com/lxc/lxc/issues/3027Ранее этот подставной/замещенный boot_id отбраковывался внутри libmdbx, так как файл располагается в
tmpfs, а не в файловой системе/proc. В результате boot_id для проверки целостности БД не был доступен. Теперь при работе внутри LXC-контейнера такой bootid будет использоваться.Однако, полноценно работающий контроль по boot_id не возможен, так как при рестарте LXC-контейнера (но не хоста) boot_id будет меняться, хотя данные в unified page cache сохраняются.
Таким образом, при рестарте LXC-контейнера без рестарта хоста, libmdbx придется откатить состояние БД до крайней точки устойчивой фиксации, что повлечет утрату данных пользователя в случаях когда они могли быть сохранены. Однако, улучшить ситуацию пока не представляется возможным, как минимум до доступности boot_id хостовой системы изнутри LXC-контейнера.
-
Устранена ошибка неверной обработки попытки запуска вложенной читающей транзакции. Теперь в таких ситуациях возвращается ошибка
MDBX_EINVAL, так как вложенность поддерживается только для транзакций чтения-записи.Ошибка была внесена при рефакторинге, коммитом
2f2df1ee76ab137ee66d00af69a82a30dc0d6debчуть более 5 лет назад и долго оставалось не замеченной. -
Устранён SIGSEGV-регресс обращения к нулевому адресу при работе в режиме только-чтение без использования LCK-файла, например при размещении БД на носителе доступном только для чтения.
Ошибка была внесена при реализации функционала парковки читающих транзакций.
Изменение поведения:
-
Теперь при включении профилирования GC (сборка с опцией
MDBX_ENABLE_PROFGC=ON) подсчитываются затраты времени ЦПУ на слияние списков страниц, т.е. на работу функцииpnl_merge(). -
В утилите тестирования значение режима данных переименовано из
data.dupsвdata.multi. -
Доработан контроль длины ключа внутри
cursor_seek().Ранее проверка внутри
cursor_seek()не позволяла искать ключи длиннее, чем можно поместить в таблицу. Однако, при поиске/позиционировании это не является ошибкой для таблиц с ключами переменного размера. -
Если посредством
mdbx_env_set_option(MDBX_opt_txn_dp_limit)пользователем не задано собственно значение, то теперь выполняется подстройка dirty-pages-limit при старте каждой не-вложенной пишущей транзакций, исходя из объёма доступного ОЗУ и размера БД. -
Теперь в режиме
MDBX_NOSTICKYTHREADSдопускается commit/abort вложенных транзакций из любого треда/потока. -
Теперь при попытке запуска вложенных транзакций в режиме
MDBX_WRITEMAPпроизводится логирование и возврат ошибкиMDBX_INCOMPATIBLE. -
Теперь в C++ API в конструкторах/инициализаторах и методах связанных с формированием геометрии БД по-умолчанию используются только
default-значений, в том числа для минимального и максимального размера. В результате, при создании БД с геометрией по-умолчанию не происходит выбор максимального размера страницы из-за очень большого максимального размера БД. -
Внутри
mdbx_env_set_geometry()доработаны эвристики для подбора параметров геометрии БД запрошенных пользователем "по-умолчанию".
v0.13.2 "Прошлогодний Снег" (Last Year's Snow) от 2024-12-11
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов в день рождения и в память об Алекса́ндре Миха́йловиче Тата́рском, российском режиссёре-мультипликаторе, создавшем такие знаменитые мультфильмы как "Падал прошлогодний снег", "Пластилиновая ворона", заставку "Спокойной ночи, малыши!" и многие другие шедевры нашего детства.
Новое:
- Ускорено обновление GC при возврате/помещении списков страниц в
сложных сценариях. Был доработан и активирован ранее отключенный
экспериментальный режим корректирующей обратной связи. Этим
принципиально улучшилась сходимость (сократилось количество повторных
попыток), а также устранен дефект приводящий к "зацикливанию" при
фиксации транзакций (с возвратом ошибки
MDBX_PROBLEM) в редких специфических условиях. Подробности см. в описании коммита6c56ed97bbd8ca46abac61886a113ba31e5f1291. - Включен стандарт
C23в CMake-скриптах сборки. - Добавлены T-макросы для парных
char/wchar_tфункций. - Поддержка вложенных пишущих транзакций в C++ API.
- Переход на "Semantic Versioning 2" и экспорт информации о версии в
VERSION.json. - Добавлена поддержка переменной среды
SOURCE_DATE_EPOCHдля воспроизводимости сборок. Прежний способ посредствомMDBX_BUILD_TIMESTAMPтакже работает и имеет приоритет. - Добавлена возможность указывать дополнительную информацию о сборке
libmdbx через опцию
MDBX_BUILD_METADATA. Сейчас задаваемая информация просто включается внутрь библиотеки в качестве значенияmdbx_build.metadata, а в дальнейшем также будет использоваться при формировании пакетов и т.п. - Добавлено логирование ошибок возвращаемых из API. Теперь для этого
достаточно задать уровень логирования
MDBX_LOG_DEBUG(для логирования ошибок за вычетомMDBX_NOTFOUND) илиMDBX_LOG_TRACE(для логирования всех ошибок, а такжеMDBX_RESULT_TRUE). - Поддержка сборки посредством Conan.
Изменение поведения:
- Добавлен метод
mdbx::cursor::get_multiple_samelength()и переименованmdbx::txn::put_multiple_samelength(). - Для единообразия C++ API при выполнении операции
MDBX_GET_MULTIPLEтеперь также возвращается значение самого ключа. - Для размерных констант
mdbx::env::geometryбазовый тип изменен с беззнаковогоsize_tна знаковыйintptr_t. - Теперь выбор в пользу использования ntdll вместо CRT делается только при явном отключении C++ API.
- Теперь выполняется освобождение памяти сброшенных/прерванных читающих
транзакций передаваемых в
mdbx_txn_commit(). Соглашение по API требует чтобы такие транзакции освобождались посредствомmdbx_txn_abort(), из-за чего функцияmdbx_txn_commit()возвращала ошибку в таких случаях, не разрушая сами транзакции. Это приводило к утечкам памяти из-за ошибок в приложениях, что побудило изменить поведение. - Использование макроса
__deprecated_enumесли он определен. - При сборке посредством CMake выбор стандарта языка
Cтеперь выполняется с учётомCMAKE_C_STANDARD. - Изменения в опциях сборки:
- опция
MDBX_OSX_SPEED_INSTEADOF_DURABILITYпереименована вMDBX_APPLE_SPEED_INSTEADOF_DURABILITY, так как актуальна для всех "Яблочных" платформ; - опция
MDBX_MMAP_USE_MS_ASYNCпереименована вMDBX_MMAP_NEEDS_JOLT, для более точного соответствия своей семантики; - в CMake добавлена поддержка опции
MDBX_USE_MINCORE; - использование
madvise()и родственных системных вызовов теперь всегда включено, а опцияMDBX_ENABLE_MADVISEудалена; - удалены неиспользуемая опция
MDBX_USE_SYNCFILERANGEи неиспользуемый режимMDBX_LOCKING_BENAPHORE.
- опция
Исправления:
- Устранен регресс возврата неверной информации из функций
mdbx_env_stat_ex()иmdbx_env_stat(). При рефакторинге до выпуска v0.13.1 была допущена ошибка, из-за которой выполнялось суммирование значений без очистки переданного пользователем буфера для результата. Таким образом, возвращаемая информация была верной, только если память используемая для размещения результата содержала нули на момент вызова функции. - Функция
mdbx_close_dbi()доработана для возврата ошибкиMDBX_DANGLING_DBIпри попытке закрыть dbi-дескриптор таблицы, созданной и/или измененной в ещё выполняющейся транзакции. Такое преждевременное закрытие дескриптора является неверным использованием API и нарушением контракта/предусловий сформулированных в описанииmdbx_close_dbi(). Однако, вместо возврата ошибки выполнялось некорректное закрытие дескриптора, что могло приводить к созданию таблицы с пустым именем, утечки страниц БД и/или нарушению структуры b-tree (неверной ссылкой на корень таблицы). - Исправлено открытие таблицы с пустым/нулевым именем, в том числе устранена
возможность
SIGSEGVпри закрытии её дескриптора. - Добавлены упущенные inline-реализации
mdbx::cursor::upper_bound()иmdbx::cursor::upper_bound_multivalue(). - Продолжена корректировка описания С++ API для использования термина "таблица" вместо "sub-database".
- Исправлено проверяемое условие внутри
assert()в пути обработкиMDBX_GET/NEXT/PREV_MULTIPLE. - На 32-битных платформах разрешено использовать 4-байтное выравнивание при получении 64-битных значений посредством
MDBX_MULTIPLE. - Добавлен костыль для устранения проблем из-за некорректной обработки
[[gnu::pure]]в Apple Clang и MSVC. - Поправлено определение
MDBX_DEPRECATED_ENUMдля старых компиляторов при включении С++11. - Доработано использование
std::experimental::filesystemдля решения проблем со сборкой в старых компиляторах. - Исправлена обработка
MDBX_GET_MULTIPLEв специальных случаях и одного значения у ключа в позиции курсора. - Исправление сборки при включении профилирования GC и
MDBX_ENABLE_DBI_SPARSE=OFF.
Мелочи:
- Теперь
MDBX_ENABLE_BIGFOOTвключена по-умолчанию вне зависимости от разрядности платформы. - Дополнение README и исправление опечаток/орфографии.
- Использование
WIN32вместо${CMAKE_SYSTEM_NAME}. - Подавление параноидальных предупреждений MSVC в extra-тестах.
- Дополнение отладочного логирования внутри
dxb_resize(). - Добавление в сценарии CMake/CTest копирования dll под Windows для работы исключений в тестах на C++.
- Добавление С++ теста
extra/open. - Доработка
osal_jitter()для уменьшения задержек в тестах под Windows. - Исправление максимальной длины значений в тесте
extra/crunched-delete. - Добавление логирования С++ исключений в
extra/dupfix_multiple. - Корректировка API-макросов для Doxygen.
- Уточнение описания
mdbx_dbi_close()для случая хендлов измененных таблиц. - Добавление теста
extra/early_close_dbi. - Доработка скрипта стохастического теста и его переименование в
stochastic.sh. - Доработка тестов для совместимости с режимами сборки до С++17.
- Добавление
.WAITдля устранения коллизий при распараллеливании сборки посредстом GNU Make 4.4.
v0.13.1 "РДС-1" от 2024-08-29
Новая версия со сменой лицензии, существенным расширением API, добавлением функционала и внутренними переработками. В том числе, с незначительным нарушением обратной совместимости API библиотеки.
Новое:
-
Изменение лицензии на Apache 2.0, пояснения и подробности в файле
COPYRIGHT. -
Реструктуризация исходного кода с рефакторингом.
-
Переработка курсоров для унификации поведения, более регулярного кода, уменьшения количества ветвлений и машинных операций.
-
Перенос функционала утилиты
mdbx_chkвнутрь библиотеки в виде функцииmdbx_env_chk()для проверка целостности структуры БД, в том числе с вовлечением логики приложения. -
Опция
MDBX_opt_gc_time_limitдля более гибкого контроля времени расходуемого на поиск последовательностей соседствующих свободных страниц в GC. -
Снижение накладных расходов на запуск транзакций в сценариях с большим количеством DBI-хендов, за счет отложенной/ленивой инициализации элементов служебных таблиц. В том числе, механизм поддержки разреженных наборов DBI-хендов, управляемый опцией сборки
MDBX_ENABLE_DBI_SPARSE, которая включена по-умолчанию. -
Снижение накладных расходов на открытие DBI-хендов. В том числе, механизм отложенного освобождения и поддержки быстрого пути открытия без использования блокировок, управляемый опцией сборки
MDBX_ENABLE_DBI_LOCKFREE, которая включена по-умолчанию. -
Поддержка "парковки" читающих транзакций с их вытеснением ради переработки старых MVCC-снимков и предотвращения проблем вызываемых приостановкой переработки мусора. Механизм парковки и вытеснения припаркованных транзакций является как дополнением, так и более простой в использовании альтернативой обратному вызову Handle-Slow-Readers. Для удобства функции
mdbx_txn_park()иmdbx_txn_unpark()имеют дополнительные аргументы, позволяющие запросить автоматическую "распарковку" припаркованных и перезапуск вытесненных транзакций. -
Расширение API позиционирования курсоров более удобными и очевидными операциями по аналогии условиям
<,<=,==,>=,>как для ключей, так и для пар ключ-значение. -
Функции
mdbx_dbi_rename()иmdbx_dbi_rename2()для переименования таблиц. -
Функции
mdbx_cursor_unbind()иmdbx_txn_release_all_cursors()для гибкого управления курсорами в сценариях повторного использования для уменьшения накладных расходов. -
Функция
mdbx_env_resurrect_after_fork()для восстановление открытой среды работы с БД в дочернем процессе после ветвления/расщепления процесса. -
Функция
mdbx_cursor_compare()для сравнения позиций курсоров аналогично оператору<=>. -
Функции
mdbx_cursor_scan()иmdbx_cursor_scan_from()для сканирования таблиц с использованием функционального предиката и уменьшением сопутствующих накладных расходов. -
Функции
mdbx_cursor_on_first_dup()иmdbx_cursor_on_last_dup()для оценки позиции курсора. -
Функция
mdbx_preopen_snapinfo()для получения информации о БД без её открытия. -
Функция
mdbx_enumerate_tables()для получение информации об именованных пользовательских таблицах. -
Поддержка функций логирования обратного вызова без функционала
vprintf(), что существенно облегчает использование логирования в привязках к другим языкам программирования. -
Режим работы
MDBX_NOSTICKYTHREADSвместоMDBX_NOTLSдля упрощения интеграции с легковесными потоками/нитями их мультиплексирования вместе с транзакциями по потокам операционной системы. -
Опция
MDBX_opt_prefer_waf_insteadof_balance. -
Опции
MDBX_opt_subpage_limit,MDBX_opt_subpage_room_threshold,MDBX_opt_subpage_reserve_prereq,MDBX_opt_subpage_reserve_limit. -
Управление основной блокировкой lock/unlock/upgrade/downgrade для координации пишущих транзакций.
-
Функции
mdbx_limits_keysize_min()иmdbx_limits_valsize_min()для получения нижней границы длины ключей и значений. -
Для идентификации БД добавлен UUID доступный в поле
mi_dxbidструктурыMDBX_envinfo, получаемой посредствомmdbx_env_info_ex(). -
Расширение API функциями lock/unlock/upgrade/downgrade основной блокировки.
-
Добавление в API функций
mdbx_cursor_unbind()иmdbx_txn_release_all_cursors(). -
Добавление в API функций
mdbx_txn_copy2pathname()иmdbx_txn_copy2fd(). -
Добавление в утилиту
mdbx_copyопций-dи-p. -
Расширение и доработка C++ API:
- добавлен тип
mdbx::cursor::estimate_result, а поведение методовmdbx::cursor::estimate()унифицировано сmdbx::cursor::move(); - для предотвращения незаметного неверного использования API, для инициализации
возвращаемых по ссылке срезов, вместо пустых срезов задействован
mdbx::slice::invalid(); - добавлены дополнительные C++ операторы преобразования к типам C API;
- для совместимости со старыми стандартами C++ и старыми версиями STL перенесены
в public классы
mdbx::buffer::move_assign_allocиmdbx::buffer::copy_assign_alloc; - добавлен тип
mdbx::default_buffer; - для срезов и буферов добавлены методы
mdbx::buffer::hex_decode(),mdbx::buffer::base64_decode(),mdbx::buffer::base58_decode(); - добавлен тип
mdbx::comparatorи функцийmdbx::default_comparator(); - добавлены статические методы
mdbx::buffer::hex(),mdbx::buffer::base64(),mdbx::buffer::base58(); - для транзакций и курсоров добавлены методы
get_/set_context; - добавлен метод
mdbx::cursor::clone(); - поддержка base58 переработана и приведена в соответствии с черновиком RFC, в текущем понимании теперь это одна из самых высокопроизводительных реализаций base58;
- переработка
to_hex()иfrom_hex(); - добавлены перегрузи со
std::string_viewдля методовopen_map/create_map/drop_map/clear_map/rename_map(); - добавлены перегрузки методов put/insert/upsert для
mdbx::pair; - добавлены методы принимающие имена таблиц/subDb через
mdbx::slice.
- добавлен тип
Нарушение совместимости:
- Использование термина "таблица" вместо "subDb".
- Опция
MDBX_COALESCEобъявлена устаревшей, так как соответствующий функционал всегда включен начиная с предыдущей версии 0.12. - Опция
MDBX_NOTLSобъявлена устаревшей и заменена наMDBX_NOSTICKYTHREADS. - Опция сборки
MDBX_USE_VALGRINDзаменена на общепринятуюENABLE_MEMCHECK. - В структуре
MDBX_envinfoсерии полей видаmeta1,meta2иmeta3заменены на массивы видаmeta[3]. - В шаблонных классах и функциях С++ API по-умолчанию вместо
mdbx::legacy_bufferиспользован типmdbx::default_bufferиспользующий полиморфные аллокаторы С++ 17. - Удаление
DEFAULT_MAPSIZEи изменение геометрии по-умолчанию при создании БД. - Возвращение
MDBX_TXN_INVALID(INT32_MIN) вместо-1изmdbx_txn_flags()при передаче невалидной транзакции.
Исправления:
-
Исправление упущенного
TXN_END_EOTDONEпри сбое старта читающей транзакции. Упомянутый флажок отсутствовал в пути разрушения транзакции при ошибке её запуска. Из-за чего делалась попытка разрушить курсоры, что приводило к падению отладочных сборок, так как в них соответствующий массив намеренно заполнен некорректными указателями. -
Устранение возможности
SIGSEGVвнутриcoherency_check()после изменения геометрии другим процессом с увеличением верхнего размера БД и увеличением БД больше предыдущего лимита. -
Исправление assert-проверки при попытке создания таблицы с другими флагами/опциями.
Мелочи:
- Обновление конфигурации Doxygen до 1.9.6.
- Добавление
--read-var-info=yesдля Valgrind. - Вывод из
mdbx_chkинформации об уровне детализации/verbosity.
v0.13.0 от 2023-04-23
Технический тэг, отмечающий начало ветки 0.13
с новым функционалом и изменением API.
v0.12.13 от 2025-02-28
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов.
Это последний/консервирующий выпуск куста стабильных версий 0.12.x, спустя более двух лет после выпуска 0.12.1.
git diff --stat: 14 commits, 7 files changed, 256 insertions(+), 103 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Значимые исправления:
-
Исправлена обработка
MDBX_GET_MULTIPLEв специальных случаях и одного значения у ключа в позиции курсора. -
Устранена ошибка неверной обработки попытки запуска вложенной читающей транзакции. Теперь в таких ситуациях возвращается ошибка
MDBX_EINVAL, так как вложенность поддерживается только для транзакций чтения-записи.Ошибка была внесена при рефакторинге, коммитом
2f2df1ee76ab137ee66d00af69a82a30dc0d6debчуть более 5 лет назад и долго оставалось не замеченной. -
Поддержка получения boot_id при работе внутри LXC-контейнера.
Из LXC-контейнера не доступен файл хостовой системы
/proc/sys/kernel/random/boot_id. Вместо него, при каждом старте контейнера, создается и заполняется случайными данными собственный boot_id смонтированный через bind изtmpfs. https://github.com/lxc/lxc/issues/3027Ранее этот подставной/замещенный boot_id отбраковывался внутри libmdbx, так как файл располагается в
tmpfs, а не в файловой системе/proc. В результате boot_id для проверки целостности БД не был доступен. Теперь при работе внутри LXC-контейнера такой bootid будет использоваться.Однако, полноценно работающий контроль по boot_id не возможен, так как при рестарте LXC-контейнера (но не хоста) boot_id будет меняться, хотя данные в unified page cache сохраняются.
Таким образом, при рестарте LXC-контейнера без рестарта хоста, libmdbx придется откатить состояние БД до крайней точки устойчивой фиксации, что повлечет утрату данных пользователя в случаях когда они могли быть сохранены. Однако, улучшить ситуацию пока не представляется возможным, как минимум до доступности boot_id хостовой системы изнутри LXC-контейнера.
-
Доработан контроль длины ключа внутри
cursor_set().Ранее проверка внутри
cursor_set()не позволяла искать ключи длиннее, чем можно поместить в таблицу. Однако, при поиске/позиционировании это не является ошибкой для таблиц с ключами переменного размера. -
Теперь при попытке запуска вложенных транзакций в режиме
MDBX_WRITEMAPпроизводится логирование и возврат ошибкиMDBX_INCOMPATIBLE. -
Доработано использование
std::experimental::filesystemдля решения проблем со сборкой в старых компиляторах.
v0.12.12 "Доллежаль" от 2024-10-27
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в память о советском ученом-энергетике Николае Антоновиче Доллежаль в день 125-летия со дня его рождения.
Это последний выпуск куста стабильных версий 0.12.x, спустя более двух
лет после выпуска 0.12.1. Последующие выпуски 0.12.x будут формироваться
только в случае существенных проблем/ошибок, вероятность чего близка к
нулю. Для всех проектов находящихся в стадии активной разработки
рекомендуется использовать ветку master.
git diff --stat: 6 commits, 5 files changed, 239 insertions(+), 6 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Значимые исправления:
-
Исправление упущенного
TXN_END_EOTDONEпри сбое старта читающей транзакции. Упомянутый флажок отсутствовал в пути разрушения транзакции при ошибке её запуска. Из-за чего делалась попытка разрушить курсоры, что приводило к падению отладочных сборок, так как в них соответствующий массив намеренно заполнен некорректными указателями. -
Устранение возможности
SIGSEGVвнутриcoherency_check()после изменения геометрии другим процессом с увеличением верхнего размера БД и увеличением БД больше предыдущего лимита. -
Доработка
mdbx_close_dbi()для возврата ошибки при попытке закрыть dbi-дескриптор таблицы, созданной и/или измененной в ещё выполняющейся транзакции. Такое преждевременное закрытие дескриптора является неверным использованием API и нарушением контракта/предусловий сформулированных в описанииmdbx_close_dbi(). Однако, вместо возврата ошибки выполнялось некорректное закрытие дескриптора, что могло приводить к созданию таблицы с пустым именем, утечки страниц БД и/или нарушению структуры b-tree (неверной ссылкой на корень таблицы). Добавлен соответствующий тестextra/early_close_dbi.
v0.12.11 "Лиза и Соня" от 2024-07-23
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в память об убитых в Крыму девочках 2 и 9 лет.
Лиза и Соня погибли 23 Июня 2024 на глазах у родителей, в результате удара по общественному городскому пляжу ракетами ATACMS с кассетными боеприпасами. Всего пострадало более 150 граждан России, в том числе 27 детей. Ракеты были выпущенными украинскими бандеровцами/фашистами, но полетные задания формировались и загружались военными США, а управление и наведение ATACAMS невозможно без использования орбитальной группировки военных спутников США.
git diff --stat: 29 commits, 14 files changed, 379 insertions(+), 151 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Значимые исправления:
-
Исправление для ОС Windows нарезки
FILE_SEGMENT_ELEMENT. Похоже что был потерян коммит входе работы над оптимизацией пути записи на диск в ОС Windows. В текущем понимании, вероятность проявления ошибки достаточно низкая, так как выявлена она была синтетическими тестами в ходе других доработок, а соответствующих сообщений/жалоб не поступало. К повреждению БД ошибка не приводила, так как сбой происходил до записи данных с возвратомERROR_INVALID_PARAMETERиз системного вызова, т.е. либо ошибка не проявлялась, либо транзакция не фиксировалась. -
Устранение вероятности
SIGSEGVпри включении логирования уровняMDBX_LOG_TRACEв отладочных сборках. -
Исправление генерации исключения
key_existsв C++ API. -
Исправление опечаток в документации и README.
-
Исправление обработки курсоров, открытых в родительских транзакциях и закрытых до завершения вложенных транзакций. В описанной ситуации закрытые курсоры "воскрешались", что приводило к утечке памяти выделенной под такие курсоры.
-
Костыль для MSVC ARM/ARM64 для предотвращения ICE (Internal Compiler Error).
-
Устранение
MDBX_EINVALдля случая вызоваmdbx_env_remove("."). -
Исправление инверсии bool-результата
env::remove()в C++ API. -
Исправление опечатки
равно/неравнов условии внутриupdate_gc(). Существенных последствий ошибки не было, но в определенных сценариях, сходимость требовала еще одного цикла повтора внутри update_gc().
Прочие доработки:
- Проверка совместимости флагов GC/FreeDB на случай их изменения в будущих версиях.
- Очистка сообщений
FormatMessageA()от концевых переводов строк. - Уточнение макроса
__always_inlineдля особо яблочных версий CLANG. - Использование
\nвместоstd::endlв C++ API для разделения строк в кодировщиках данных. - Проверка дополнительных и пока не используемых полей в meta-страницах.
- Отключение ненужной отладки внутри
txn_merge(). - Исправление условий и привязки к версиям компиляторов при формировании макроса
MDBX_DEPRECATED. - Больше атрибутов
__coldдля редко-используемых функций (backport). - Добавление методов
buffer::append_bytes()иbuffer::clear_and_reserve(). - Отключение установки признака фатальной ошибки для не-активной среды при отличии идентификатора процесса.
v0.12.10 "СЭМ" от 2024-03-12
Поддерживающий выпуск с исправлением обнаруженных ошибок и устранением недочетов в память Героя России гвардии майора Дмитрия Семёнова с позывным "СЭМ".
git diff --stat: 19 commits, 57 files changed, 751 insertions(+), 331 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Благодарности:
- Dvir H за сообщение
об ошибке
MDBX_CORRUPTEDв сценарии работы в режимеMDBX_DUPFIXEDи нечетной длиной мульти-значений, с предоставлением точного минимального сценария воспроизведения.
Значимые исправления и доработки:
-
Устранение унаследованной от LMDB ошибки приводящей к повреждению БД при использовании
MDBX_DUPFIXED. Проблема была выявлена при расширении тестов сценариями с длинными мульти-значениями в режимеMDBX_DUPFIXED. Сообщений о проявлении этой ошибки в эксплуатационных/продуктовых средах не поступало.На LEAF2-страниц, используемых для компактного хранения мульти-значений фиксированной длины, выполнялось резервирование места без учета возможности превышения размера страниц, с последующим переполнением, повреждением структуры БД и/или повреждением содержимого ОЗУ.
Вероятность проявления ошибки существенно увеличивалась с увеличением размера/длины мульти-значений/дубликатов и уменьшением размера страницы БД. Поэтому при использовании
MDBX_INTEGERDUPвероятность проявления близка к нулю, а сценарий такого проявления найти не удалось.В MDBX ошибка присутствовала с момента отделения проекта от LMDB, где эта ошибка присутствует более 11 лет, по настоящее время.
-
Исправление ложной ошибки
MDBX_CORRUPTED (-30796)в сценарии работы в режимеMDBX_DUPFIXEDи нечетной длиной мульти-значений. -
Исправление недочета корректировки сопутствующих курсоров при разделении страницы по сценарию добавления пустой страницы слева.
-
Доработка
rebalance()ради уменьшения WAF. Новый функционал, включая контролируемую пользователем опциюenum MDBX_option_t, будет доступен в выпусках ветки0.13.x, а в этом выпуске доработка сводится к тактике не-вовлечения чистой страницы при нехватке запаса страниц в ходе обновления GC, за счет ухудшения баланса дерева страниц. -
Устранение упущения приводящего к нелогичной ситуации
me_dxb_mmap.curren > me_dxb_mmap.limitпри "дребезге" размера БД. В текущем понимании, последствий кроме срабатывания assert-проверки нет, а вероятность проявления близка к нулю. -
Исправление в функционале обхода дерева, используемого утилитой
mdbx_chk, подсчета места затраченного на выравнивание на вложенной под-странице, в случае нечетного количества dupfixed-элементов нечетного размера. Сообщений о проявлении этой ошибки в эксплуатационных/продуктовых средах не поступало. -
Исправление assert-проверки внутри
check_txn()для случая завершенных транзакций в режимеMDBX_NO_TLS. Последствий ошибки, кроме срабатывания assert-проверки в отладочных сборках, нет. -
Устранение ошибки при открытии БД на файловой системе только-для-чтения.
-
Удалены излишне строгие проверки в утилите
mdbx_chk, которые приводили к ложно-позитивным ошибкам при проверке БД после серии последних доработок. Подробности см в комментариях к коммитам 781b3f64d52b73cbaeb00a55811d1247c25624a8 и 0741c81cfd8dc0864fcf55e04192b2207c8f68f7.
Прочее:
- Расширение стохастического теста dupfixed-сценариями.
- Корректировка условия в assert-проверке для
MDBX_TXN_DRAINED_GC. - Добавление в jitter-сценарий простого теста сброса и перезапуска читающих транзакций.
- Вынужденное продолжение очистки/рефакторинга унаследованных ребусов в
cursor_put_nochecklen(). - Фиксация транзакции при ошибках теста для последующего анализа содержимого БД.
- Сопутствующий рефакторинг
node_shrink()для ясности исходного кода. - Приведение в соответствие протоколируемых имен тестов опциям командной строки.
- Добавление cmoke-теста
extra/dupfixed_addodd.
v0.12.9 "Ясень-4" от 2023-12-11
Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов.
git diff --stat: 32 commits, 8 files changed, 667 insertions(+), 401 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Исправления и доработки:
-
Ликвидация зависимости от ранее удаленной опции
MDBX_ENABLE_PREFAULT, из-за чего опцияMDBX_ENABLE_MINCOREне включалась автоматически, что приводило к не-активации соответствующего улучшения и не-достижению декларируемого уровня производительности в сценариях использования в режимеMDBX_WRITEMAP. -
Исправление авто-установки
MDBX_ENV_CHECKPIDпри отключении использования функционалаmadvise()посредством опции сборкиMDBX_ENABLE_MADVISE=0. Из-за чего при поддержке системойmadvise(MADV_DONTFORK)не включался контроль pid. -
Добавлена проверка переданного ключа на
NULLпри обработкеMDBX_GET_MULTIPLE. -
Добавлена проверка номеров корневых страниц в
coherency_check(). -
Обеспечен
constдля начала и конца диапазона в аргументахmdbx_estimate_range(). -
Из разрабатываемой версии перенесены не-нарушающие совместимости доработки C++ API:
- добавлен тип
mdbx::cursor::estimate_result, а поведение методовcursor::estimate()унифицировано сcursor::move(); - для предотвращения незаметного неверного использования API, для инициализации
возвращаемых по ссылке срезов, вместо пустых срезов задействован
slice::invalid(); - добавлены дополнительные C++ операторы преобразования к типам C API;
- для совместимости со старыми стандартами C++ и старыми версиями STL перенесены
в public классы
buffer::move_assign_allocиbuffer::copy_assign_alloc; - добавлен тип
mdbx::default_buffer; - для срезов и буферов добавлены методы
hex_decode(),base64_decode(),base58_decode(); - добавлен тип
mdbx::comparatorи функцийmdbx::default_comparator(); - добавлены статические методы
buffer::hex(),base64(),base58(); - для транзакций и курсоров добавлены методы
get_/set_context; - добавлен метод
cursor::clone();
- добавлен тип
-
Поддержка base58 приведена в соответствии с черновиком RFC.
-
Переработка/исправление
to_hex()иfrom_hex(). -
Уменьшение
MDBX_opt_rp_augment_limitпо умолчанию до 1/3 от текущего количества страниц в БД.
Мелочи:
- Удаление устаревших
mdbx_set_compare()иmdbx_set_dupsort(). - Корректировка определения
MDBX_LAST_ADDED_ERRCODE. - Добавление в C++ API забытого исключения
mdbx::duplicated_lck_file. - Обновление патча для старых версий buildroot.
- Использование в API
const MDBX_txnгде это возможно. - Удаление устаревшего упоминания
MDBX_EAGAIN. - Проверка pid процесса только в функциях API требующих активной среды/env.
- Исправление опечаток в комментариях, в том числе в doxygen-описании.
- В тестах для совместимости с проблемными версиями glibc и glibc++
устранено использование
std::stoull().
v0.12.8 "Владимир Уткин" от 2023-10-17
Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день 100-летия со дня рождения выдающегося советского и российского ученого и конструктора Влади́мира Фёдоровича У́ткина.
git diff --stat: 24 commits, 18 files changed, 624 insertions(+), 94 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Благодарности:
- Alain Picard за сообщение о проблеме
с обработкой
MDBX_MULTIPLEи помощь в тестировании.
Исправления и доработки:
-
Устранение регресса/ошибки в пути обработки
put(MDBX_MULTIPLE)при пакетном/оптовом помещении в БД множественных значений одного ключа (aka multi-value или dupsort). Проявление проблемы зависит от компилятора и опций оптимизации/кодогенерации, но с большой вероятностью возвращается ошибкаMDBX_BAD_VALSIZE(-30781), а в отладочных сборках срабатывает проверкаcASSERT(mc, !"Invalid key-size"). Сценарии приводящие к другим проявлениям на данный момент не известны. -
Реализована перезапись в
mdbx_put(MDBX_CURRENT)всех текущих мульти-значений ключа при отсутствии флагаMDBX_NOOVERWRITE. Ранее в такой ситуации возвращалась ошибкаMDBX_EMULTIVAL. В текущем понимании новое поведение более удобно и не создаёт проблем совместимости с ранее написанным кодом. -
Добавлена возможность использовать
mdbx_cursor_get(MDBX_GET_MULTIPLE)без предварительной установки курсора, совмещая операцию пакетного получения данных с позиционированием курсора на передаваемый ключ. -
Микрооптимизация и рефакторинг
cursor_put_nochecklen()в продолжение исправления регресса/ошибки в пути обработкиput(MDBX_MULTIPLE). -
Уточнение формулировок в описании API, в том числе пояснений о
SIGSEGVи недопустимости прямого изменения данных.
Мелочи:
- Исправление несущественных предупреждений при
MDBX_ENABLE_PROFGC=ON. - Добавление
slice::as_pod<typename>()в C++ API. - Добавление перегрузки
txn::put_multiple()и контроля POD в C++ API. - Добавление smoke-теста для
put(MDBX_MULTIPLE). - Добавление дополнительных smoke-тестов в область видимости ctest.
- Устранение жалоб Valgrind на инвариантное чтение неинициализированной памяти и утечки памяти в одном из тестов.
- Костыль для глушения/игнорирования
EDEADLKв ряде сценариев при использовании Valgrind или ASAN. В частности, это устраняет ложно-негативный результат проверки БД посредствомmdbx_chk -wc, т.е. проверку БД в кооперативном (не эксклюзивном) режиме чтения-записи в сборках с поддержкой Valgrind или включеным ASAN. Для более подробной информации см. соответствующий коммит. - Доработка
mdbx_dump_val()используемой для логирования и отладки. - Устранение предупреждений Valgrind при логировании в отладочных сборках.
- Доработка использования
filesystemдля старых компиляторов. - Сокращение излишнего вызова
osal_thread_self(). - Вывод информации о большинстве mdbx-опций при сборке посредством CMake.
- Добавление определений макросов для Doxygen.
v0.12.7 "Артек" от 2023-06-16
Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день основания международного детского центра «Арте́к».
14 files changed, 222 insertions(+), 56 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Исправления и доработки:
-
Исправление опечатки в имени переменной внутри
mdbx_env_turn_for_recovery(), что приводило к неверному поведению в некоторых ситуациях.С точки зрения пользователя, с учетом актуальных сценариев использования утилиты
mdbx_chk, был только один специфический/редкий сценарий проявления ошибки/проблемы - когда выполнялась проверка и активация слабой/weak мета-страницы с НЕ-последней транзакцией после системной аварии машины, где БД использовалась в хрупком/небезопасном режиме. В сценарии, при успешной проверке целевой страницы и её последующей активации выводилось сообщение об ошибке, связанной со срабатыванием механизма контроля не-когерентности кэша файловой системы и отображенных в ОЗУ данных БД. При этом БД успешно восстанавливалось и не было каких-либо негативных последствия, кроме самого сообщения об ошибке.Технически же ошибка проявлялась при "переключении" на мета-страницу, когда у хотя-бы одной из двух других мета-страниц номер транзакции был больше:
-
Если содержимое других мета-страниц было корректным, а номера связанных транзакций были больше, то результирующий номер транзакции в целевой/активируемой мета-страницы устанавливается без учета этих мета-страниц и мог быть меньше-или-равным.
-
В результате, если такие мета-страницы были в статусе слабых/weak, то при закрытии БД после переключения могла срабатывать защита от не-когерентности unified buffer/page cache, а в отладочных сборках могла срабатывать assert-проверка.
-
Если же такие мета-страницы были в статусе сильных/steady, то переключение на новую мета-страницу могло не давать эффекта либо приводить к появлению двух мета-страниц с одинаковым номером транзакции, что является ошибочной ситуацией.
-
-
Обходное решение проблем сборки посредством GCC с использование опций
-m32 -arch=i686 -Ofast. Проблема обусловлена ошибкой GCC, из-за которой конструкция__attribute__((__target__("sse2")))не включает полноценное использование инструкций SSE и SSE2, если это не было сделано посредством опций командной строки, но была использована опция-Ofast. В результате сборка заканчивалась сообщением об ошибке:error: inlining failed in call to 'always_inline' '_mm_movemask_ps': target specific option mismatch -
Доработка режима "восстановления" БД и переключения на заданную мета-страницу:
- Устранение обновления без необходимости мета-страницы с увеличением номера транзакции;
- Устранение вывода (логирования) бессмысленного/лишнего предупреждения о пропуске обновления геометрии БД;
- Более ожидаемое и безопасное поведение при проверке БД с указанием целевой мета-страницы в режиме чтения-записи.
Теперь при открытии БД посредством
mdbx_env_open_for_recovery()не выполняется неявное изменение/обновление БД, в том числе при закрытии БД. Это позволяет обезопасить БД (снизить шанс её разрушения) если пользователь при попытке восстановления, либо просто в качестве эксперимента, задал утилитеmdbx_chkневерную или опасную комбинацию параметров. При этом обычная проверка, как и явное переключение мета-страниц, работают по-прежнему.
Мелочи:
- Незначительное уточнение CMake-пробника для
std::filesystem, проверяющего необходимость линковки с дополнительными библиотеками C++. - Устранение минорных предупреждений старых компиляторов в тестах.
- Устранение причины ложно-позитивного предупреждения новых версий GCC в C++ API.
- Исправление ссылки на репозиторий бенчмарка ioarena.
- Добавление перекрестных ссылок в doxygen-документацию по C++ API.
- Уточнение ограничений в разделе Restrictions & Caveats.
- Исправление ссылок на описание
mdbx_canary_put().
v0.12.6 "ЦСКА" от 2023-04-29
Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день 100-летнего юбилея спортивного клуба «ЦСКА».
14 files changed, 117 insertions(+), 83 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Мелочи:
- Обновление патча для старых версий buildroot.
- Использование clang-format-16.
- Использование
enum-типов вместоintдля устранения предупреждений GCC 13, что могло ломать сборку в Fedora 38.
v0.12.5 "Динамо" от 2023-04-18
Стабилизирующий выпуск с исправлением обнаруженных ошибок и устранением недочетов, в день 100-летнего юбилея спортивного общества «Динамо».
16 files changed, 686 insertions(+), 247 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Благодарности:
- Max maxc0d3r@protonmail.com за сообщение о проблеме экспорта из DSO/DLL устаревших функций API.
@calvin3721за сообщение о проблеме работыMainDBс флагами не по-умолчанию.
Исправления:
- Поправлен экспорт из DSO/DLL устаревших функций, которые заменены на inline в текущем API.
- Устранено использование неверного компаратора при создании или пересоздании
MainDBс флагами/опциями предполагающим использование специфического компаратора (не по-умолчанию).
Мелочи:
- Удалена дублирующая диагностика внутри
node_read_bigdata(). - Исправлены ссылки в описании
mdbx_env_set_geometry(). - Добавлен отдельный тест
extra/upsert_alldupsдля специфического сценария замены/перезаписи одним значением всех multi-значений соответствующих ключу, т.е. замена всех «дубликатов» одним значением. - В C++ API добавлены варианты
buffer::key_from()с явным именованием по типу данных. - Добавлен отдельный тест
extra/maindb_ordinalдля специфического сценария созданияMainDBс флагами требующими использования компаратора не по-умолчанию. - Рефакторинг проверки "когерентности" мета-страниц.
- Корректировка
osal_vasprintf()для устранения предупреждений статических анализаторов.
v0.12.4 "Арта-333" от 2023-03-03
Стабилизирующий выпуск с исправлением обнаруженных ошибок, устранением недочетов и технических долгов. Ветка 0.12 считается готовой к продуктовому использованию, получает статус стабильной и далее будет получать только исправление ошибок. Разработка будет продолжена в ветке 0.13, а ветка 0.11 становится архивной.
63 files changed, 1161 insertions(+), 569 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Благодарности:
- Max maxc0d3r@protonmail.com за сообщение о проблеме ERROR_SHARING_VIOLATION в режиме MDBX_EXCLUSIVE на Windows.
- Alisher Ashyrov https://t.me/a1is43ras4 за сообщение о проблеме с assert-проверкой и содействие в отладке.
- Masatoshi Fukunaga https://gitflic.ru/user/mah0x211 за сообщение о проблеме
put(MDBX_UPSERT+MDBX_ALLDUPS)для случая замены всех значений в subDb.
Исправления:
-
Устранен регресс после коммита
474391c83c, приводящий к возврату ERROR_SHARING_VIOLATION в Windows при открытии БД в режиме MDBX_EXCLUSIVE для чтения-записи. -
Добавлено ограничение размера отображения при коротком read-only файле, для предотвращения ошибки ERROR_NOT_ENOUGH_MEMORY в Windows, которая возникает в этом случае и совсем не информативна для пользователя.
-
Произведен рефакторинг
dxb_resize(), в том числе, для устранения срабатывания assert-проверкиsize_bytes == env->me_dxb_mmap.currentв специфических многопоточных сценариях использования. Проверка срабатывала только в отладочных сборках, при специфическом наложении во времени читающей и пишущей транзакции в разных потоках, одновременно с изменением размера БД. Кроме срабатывание проверки, каких-либо других последствий не возникало. -
Устранена проблема в
put(MDBX_UPSERT+MDBX_ALLDUPS)для случая замены всех значений единственного ключа в subDb. В ходе этой операции subDb становится полностью пустой, без каких-либо страниц и именно эта ситуация не была учтена в коде, что приводило к повреждению БД при фиксации такой транзакции. -
Устранена излишняя assert-проверка внутри
override_meta(). Что в отладочных сборках могло приводить к ложным срабатываниям при восстановлении БД, в том числе при автоматическом откате слабых мета-страниц. -
Скорректированы макросы
__cold/__hot, в том числе для устранения проблемыerror: inlining failed in call to ‘always_inline FOO(...)’: target specific option mismatchпри сборке посредством GCC >10.x для SH4.
Ликвидация технических долгов и мелочи:
- Исправлены многочисленные опечатки в документации.
- Доработан тест для полной стохастической проверки
MDBX_EKEYMISMATCHв режимеMDBX_APPEND. - Расширены сценарии запуска
mdbx_chkиз CMake-тестов для проверки как в обычном, так и эксклюзивном режимах чтения-записи. - Уточнены спецификаторы
constиnoexceptдля нескольких методов в C++ API. - Устранено использование стека под буферы для
wchar-преобразования путей. - Для Windows добавлена функция
mdbx_env_get_path()для получения пути к БД в формате многобайтных символов. - Добавлены doxygen-описания для API с широкими символами.
- Устранены предупреждения статического анализатора MSVC, все они были несущественные, либо ложные.
- Устранено ложное предупреждение GCC при сборке для SH4.
- Добавлена поддержка ASAN (Address Sanitizer) при сборке посредством MSVC.
- Расширен набор перебираемых режимов в скрипте
test/stochastic.sh, добавлена опция--extra. - В C++ API добавлена поддержка расширенных опций времени выполнения
mdbx::extra_runtime_option, аналогичноenum MDBX_option_tиз C API. - Вывод всех счетчиков page-operations в
mdbx_stat.
v0.12.3 "Акула" от 2023-01-07
Выпуск с существенными доработками и новой функциональностью в память о закрытом open-source проекте "Акула".
Добавлена prefault-запись, переделан контроль “некогерентности” unified page/buffer cache, изменена тактика слияния страниц и т.д. Стало ещё быстрее, в некоторых сценариях вдвое.
20 files changed, 4508 insertions(+), 2928 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Благодарности:
- Alex Sharov и команде Erigon за тестирование.
- Simon Leier за сообщение о сбоях и тестирование.
Новое:
-
Использование адреса 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 приводит к "вталкиванию" данных, устраняя необходимость чтения с диска при обращении к такой странице памяти.
Новый функционал работает в согласованности с автоматическим управлением read-ahead и кэшем статуса присутствия страниц в ОЗУ, посредством mincore().
-
Добавлена опция
MDBX_opt_prefault_write_enableдля возможности принудительного включения/выключения prefault-записи. -
Реализован динамический выбор между сквозной записью на диск и обычной записью с последующим fdatasync() управляемый опцией
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 приводящей к использованию неверного режимаtls_model. -
Изменение тактики слияния страниц при удалении. Теперь слияние выполняется преимущественно с уже измененной/грязной страницей. Если же справа и слева обе страницы с одинаковым статусом, то с наименее заполненной, как прежде. В сценариях с массивным удалением это позволяет увеличить производительность до 50%.
-
Добавлен контроль отсутствия LCK-файлов с альтернативным именованием.
Исправления (без корректировок новых функций):
-
Изменение размера отображения если это требуется для сброса данных на диск при вызове
mdbx_env_sync()из параллельного потока выполнения вне работающей транзакции. -
Исправление регресса после коммита
db72763de0от 2022-10-08 в логике возврата грязных страниц в режимеMDBX_WRITEMAP, из-за чего освободившиеся страницы использовались не немедленно, а попадали в retired-список совершаемой транзакции и происходил необоснованный рост размера транзакции. -
Устранение SIGSEGV или ошибочного вызова
free()в ситуациях повторного открытия среды посредствомmdbx_env_open(). -
Устранение ошибки совершенной в коммите
fe20de136cот 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 для уменьшения накладных расходов.
- Рефакторинг и микрооптимизация.
v0.12.2 "Иван Ярыгин" от 2022-11-11
Выпуск с существенными доработками и новой функциональностью в память о российском борце Иване Сергеевиче Ярыгине.
На Олимпийских играх в Мюнхене в 1972 году Иван Ярыгин уложил всех соперников на лопатки, суммарно затратив менее 9 минут. Этот рекорд никем не побит до сих пор.
64 files changed, 5573 insertions(+), 2510 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
Новое:
-
Поддержка всех основных опций при сборке посредством 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_SUPPORTSbuild 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_APPENDDUPinsidemdbx_cursor_put()which could result in returningMDBX_EKEYMISMATCHfor valid cases. - Fixed nasty
clz()bug (by using_BitScanReverse(), only MSVC builds affected).
Мелочи:
- Исторические ссылки cвязанные с удалённым на
githubпроектом перенаправлены на web.archive.org. - Синхронизированы конструкции 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. - Небольшие правки скрипта
stochastic.shдля работы в Windows. - Удаление ненужного вызова
LockFileEx()внутриmdbx_env_copy(). - Добавлено описание использования файловых дескрипторов в различных режимах.
- Добавлено использование
_CrtDbgReport()в отладочных сборках. - Fixed an extra ensure/assertion check of
oldest_readerinsidetxn_end(). - Removed description of deprecated usage of
MDBX_NODUPDATA. - Fixed regression ASAN/Valgring-enabled builds.
- Fixed minor MingGW warning.
v0.12.1 "Positive Proxima" at 2022-08-24
The planned frontward release with new superior features on the day of 20 anniversary of Positive Technologies.
37 files changed, 7604 insertions(+), 7417 deletions(-)
Signed-off-by: Леонид Юрьев (Leonid Yuriev) <leo@yuriev.ru>
New:
- The
Big Footfeature which significantly reduces GC overhead for processing large lists of retired pages from huge transactions. Now libmdbx avoid creating large chunks of PNLs (page number lists) which required a long sequences of free pages, aka large/overflow pages. Thus avoiding searching, allocating and storing such sequences inside GC. - Improved hot/online validation and checking of database pages both for more robustness and performance.
- New solid and fast method to latch meta-pages called
Troika. The minimum of memory barriers, reads, comparisons and conditional transitions are used. - New
MDBX_VALIDATIONenvironment options to extra validation of DB structure and pages content for carefully/safe handling damaged or untrusted DB. - Accelerated ×16/×8/×4 by AVX512/AVX2/SSE2/Neon implementations of search page sequences.
- Added the
gcrtime_seconds16dot16counter to the "Page Operation Statistics" that accumulates time spent for GC searching and reclaiming. - Copy-with-compactification now clears/zeroes unused gaps inside database pages.
- The
CandC++APIs has been extended and/or refined to simplify usingwchar_tpathnames. On Windows themdbx_env_openW(),mdbx_env_get_pathW(),mdbx_env_copyW(),mdbx_env_open_for_recoveryW()are available for now, but themdbx_env_get_path()has been replaced in favor ofmdbx_env_get_pathW(). - Added explicit error message for Buildroot's Microblaze toolchain maintainers.
- Added
MDBX_MANAGE_BUILD_FLAGSbuild options for CMake. - Speed-up internal
bsearch/lower_boundimplementation using branchless tactic, including workaround for CLANG x86 optimiser bug. - A lot internal refinement and micro-optimisations.
- Internally counted volume of dirty pages (unused for now but for coming features).
Fixes:
- Never use modern
__cxa_thread_atexit()on Apple's OSes. - Don't check owner for finished transactions.
- Fixed typo in
MDBX_EINVALwhich breaks MingGW builds with CLANG.
v0.12.0 at 2022-06-19
Not a release but preparation for changing feature set and API.
For early releases and changes see the ChangeLog-NN the git commit history.