diff --git a/ChangeLog.md b/ChangeLog.md index 1d1fa6df..adc2db6a 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -28,7 +28,7 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx Таким образом, у пользователя появляется возможность легко диагностировать лишние/ненужные транзакции записи. - Добавлена опция сборки `MDBX_ENABLE_NON_READONLY_EXPORT` позволяющая использовать в режиме чтения-записи БД расположенных в файловых системах экспортированных через NFS. - По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных файловых системах доступных извне по NFS будет возвращаться ошибка `MDBX_EREMOTE`. + По-умолчанию опция выключена и при открытии в неэксклюзивном режиме чтения-записи БД расположенных в файловых системах доступных извне по NFS будет возвращаться ошибка `MDBX_EREMOTE`. Включение опции позволяет открывать БД в описанных выше ситуациях, но риск чтения неверных данных на удалённой стороне ложится на пользователя. - Поддержка MacOS universal binaries при сборке посредством CMake. @@ -70,10 +70,10 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx - Запрещена отвязка/открепление курсоров во вложенных транзакциях, т.е. вызовы `mdbx_cursor_unbind()` и `mdbx_txn_release_all_cursors(unbind=true)` для курсоров открытых в одной из родительских транзакций. - Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность - — следует ли восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может - поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые - курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения. + Причина в том, что в случае отмены вложенной транзакции возникает неконструктивная неопределенность — следует ли + восстанавливать состояние курсоров. Если не восстанавливать, то получается что вложенная транзакция может поломать родительскую, + сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, + что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения. - В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вывоза `mdbx::cursor::txn()`. @@ -139,7 +139,7 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx - Устранён регресс при использовании курсоров для DBI=0 в читающих транзакциях. - В результате рефакторинга и ряда оптимизаций для завершения/гашения + После рефакторинга и ряда оптимизаций для завершения/гашения курсоров в читающих и пишущих транзакций стал использоваться общий код. Причем за основу, был взят соответствующий фрагмент относящийся к пишущим транзакциям, в которых пользователю не позволяется @@ -232,7 +232,76 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx ******************************************************************************** -## v0.13.5 "Труба" запланирован на 2025-03-21 +## v0.13.6 "Бузина" от 2025-04-22. + +Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов, +в память о погибшем украинском историке и писателе [Алесе Бузине](https://ru.ruwiki.ru/wiki/Бузина,_Олесь_Алексеевич). + +Благодарности: + + - [Erigon](https://erigon.tech/) за спонсорство. + - [Илье Михееву](https://t.me/IlyaMkhv) и команде [Erigon](https://github.com/erigontech) за сообщения о проблеме и тестирование. + - [Алексею Костюку (aka Keller)](https://t.me/keller18306) за сообщения о проблеме копирования на 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 Поддерживающий выпуск стабильной ветки с исправлением обнаруженных ошибок и устранением недочётов. @@ -335,7 +404,7 @@ and [by Yandex](https://translated.turbopages.org/proxy_u/ru-en.en/https/libmdbx поломать родительскую, сделав её продолжение невозможным. Если восстанавливать, то также следует «воскрешать» закрытые курсоры, что неизбежно приведет к путанице, утечкам памяти и использованию после освобождения. - - В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вывоза `mdbx::cursor::txn()`. + - В C++ API отменён вброс исключения при запросе транзакции у отсоединённого курсора посредством вызова `mdbx::cursor::txn()`. Прочие доработки: diff --git a/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch b/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch index 2ccb2846..65aab19e 100644 --- a/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch +++ b/packages/buildroot/0001-package-libmdbx-new-package-library-database.patch @@ -1,7 +1,7 @@ -From 49256dcd050fd0ee67860b7bc544dabe088d08e9 Mon Sep 17 00:00:00 2001 +From 349c08cf21b66ecea851340133a1b845c25675f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4=20=D0=AE=D1=80=D1=8C?= =?UTF-8?q?=D0=B5=D0=B2=20=28Leonid=20Yuriev=29?= -Date: Fri, 14 Feb 2025 21:34:25 +0300 +Date: Tue, 22 Apr 2025 14:38:49 +0300 Subject: [PATCH] package/libmdbx: new package (library/database). MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 @@ -15,7 +15,7 @@ This patch adds libmdbx: in terms of reliability, features and performance. - more information at https://libmdbx.dqdkfa.ru -The 0.13.4 "Sigma Boy" is stable release of _libmdbx_ branch with new superior features. +The 0.13.6 "Бузина" (Elderberry) is stable release of _libmdbx_ branch with new superior features. The complete ChangeLog: https://gitflic.ru/project/erthink/libmdbx/blob?file=ChangeLog.md @@ -110,19 +110,19 @@ index 0000000000..a9a4ac45c5 + !BR2_TOOLCHAIN_GCC_AT_LEAST_4_4 diff --git a/package/libmdbx/libmdbx.hash b/package/libmdbx/libmdbx.hash new file mode 100644 -index 0000000000..202937e7be +index 0000000000..ae5266716b --- /dev/null +++ b/package/libmdbx/libmdbx.hash @@ -0,0 +1,6 @@ +# Hashes from: https://libmdbx.dqdkfa.ru/release/SHA256SUMS -+sha256 86df30ca2231c9b3ad71424bb829dca9041947f5539d4295030c653d4982c1be libmdbx-amalgamated-0.13.4.tar.xz ++sha256 57db987de6f7ccc66a66ae28a7bda9f9fbb48ac5fb9279bcca92fd5de13075d1 libmdbx-amalgamated-0.13.6.tar.xz + +# Locally calculated +sha256 0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594 LICENSE -+sha256 699a62986b6c8d31124646dffd4b15872c7d3bc5eecea5994edb1f5195df49d1 NOTICE ++sha256 651f71b46c6bb0046d2122df7f9def9cb24f4dc28c5b11cef059f66565cda30f NOTICE diff --git a/package/libmdbx/libmdbx.mk b/package/libmdbx/libmdbx.mk new file mode 100644 -index 0000000000..a8a6f3dbdf +index 0000000000..571757262e --- /dev/null +++ b/package/libmdbx/libmdbx.mk @@ -0,0 +1,42 @@ @@ -132,7 +132,7 @@ index 0000000000..a8a6f3dbdf +# +################################################################################ + -+LIBMDBX_VERSION = 0.13.4 ++LIBMDBX_VERSION = 0.13.6 +LIBMDBX_SOURCE = libmdbx-amalgamated-$(LIBMDBX_VERSION).tar.xz +LIBMDBX_SITE = https://libmdbx.dqdkfa.ru/release +LIBMDBX_SUPPORTS_IN_SOURCE_BUILD = NO @@ -169,5 +169,5 @@ index 0000000000..a8a6f3dbdf + +$(eval $(cmake-package)) -- -2.48.1 +2.49.0 diff --git a/src/api-copy.c b/src/api-copy.c index 08c01192..9f0ce892 100644 --- a/src/api-copy.c +++ b/src/api-copy.c @@ -571,11 +571,17 @@ retry_snap_meta: uint8_t *const data_buffer = buffer + ceil_powerof2(meta_bytes, globals.sys_pagesize); #if MDBX_USE_COPYFILERANGE static bool copyfilerange_unavailable; +#if (defined(__linux__) || defined(__gnu_linux__)) + if (globals.linux_kernel_version >= 0x05030000 && globals.linux_kernel_version < 0x05130000) + copyfilerange_unavailable = true; +#endif /* linux */ bool not_the_same_filesystem = false; - struct statfs statfs_info; - if (fstatfs(fd, &statfs_info) || statfs_info.f_type == /* ECRYPTFS_SUPER_MAGIC */ 0xf15f) - /* avoid use copyfilerange_unavailable() to ecryptfs due bugs */ - not_the_same_filesystem = true; + if (!copyfilerange_unavailable) { + struct statfs statfs_info; + if (fstatfs(fd, &statfs_info) || statfs_info.f_type == /* ECRYPTFS_SUPER_MAGIC */ 0xf15f) + /* avoid use copyfilerange_unavailable() to ecryptfs due bugs */ + not_the_same_filesystem = true; + } #endif /* MDBX_USE_COPYFILERANGE */ for (size_t offset = meta_bytes; rc == MDBX_SUCCESS && offset < used_size;) { @@ -760,14 +766,24 @@ __cold static int copy2pathname(MDBX_txn *txn, const pathchar_t *dest_path, MDBX lock_op.l_whence = SEEK_SET; lock_op.l_start = 0; lock_op.l_len = OFF_T_MAX; - if (MDBX_FCNTL(newfd, MDBX_F_SETLK, &lock_op) -#if (defined(__linux__) || defined(__gnu_linux__)) && defined(LOCK_EX) && \ - (!defined(__ANDROID_API__) || __ANDROID_API__ >= 24) - || flock(newfd, LOCK_EX | LOCK_NB) -#endif /* Linux */ - ) + if (MDBX_FCNTL(newfd, MDBX_F_SETLK, &lock_op)) rc = errno; } + +#if defined(LOCK_EX) && (!defined(__ANDROID_API__) || __ANDROID_API__ >= 24) + if (rc == MDBX_SUCCESS && flock(newfd, LOCK_EX | LOCK_NB)) { + const int err_flock = errno, err_fs = osal_check_fs_local(newfd, 0); + if (err_flock != EAGAIN || err_fs != MDBX_EREMOTE) { + ERROR("%s flock(%" MDBX_PRIsPATH ") error %d, remote-fs check status %d", "unexpected", dest_path, err_flock, + err_fs); + rc = err_flock; + } else { + WARNING("%s flock(%" MDBX_PRIsPATH ") error %d, remote-fs check status %d", "ignore", dest_path, err_flock, + err_fs); + } + } +#endif /* LOCK_EX && ANDROID_API >= 24 */ + #endif /* Windows / POSIX */ if (rc == MDBX_SUCCESS) diff --git a/src/osal.c b/src/osal.c index 58f30162..66d72596 100644 --- a/src/osal.c +++ b/src/osal.c @@ -1745,7 +1745,7 @@ MDBX_INTERNAL int osal_check_fs_incore(mdbx_filehandle_t handle) { return MDBX_RESULT_FALSE; } -static int osal_check_fs_local(mdbx_filehandle_t handle, int flags) { +MDBX_INTERNAL int osal_check_fs_local(mdbx_filehandle_t handle, int flags) { #if defined(_WIN32) || defined(_WIN64) if (globals.running_under_Wine && !(flags & MDBX_EXCLUSIVE)) return ERROR_NOT_CAPABLE /* workaround for Wine */; diff --git a/src/osal.h b/src/osal.h index 484bbab8..06f58c60 100644 --- a/src/osal.h +++ b/src/osal.h @@ -481,6 +481,7 @@ MDBX_INTERNAL int osal_resume_threads_after_remap(mdbx_handle_array_t *array); MDBX_INTERNAL int osal_msync(const osal_mmap_t *map, size_t offset, size_t length, enum osal_syncmode_bits mode_bits); MDBX_INTERNAL int osal_check_fs_rdonly(mdbx_filehandle_t handle, const pathchar_t *pathname, int err); MDBX_INTERNAL int osal_check_fs_incore(mdbx_filehandle_t handle); +MDBX_INTERNAL int osal_check_fs_local(mdbx_filehandle_t handle, int flags); MDBX_MAYBE_UNUSED static inline uint32_t osal_getpid(void) { STATIC_ASSERT(sizeof(mdbx_pid_t) <= sizeof(uint32_t));