mirror of
https://github.com/isar/libmdbx.git
synced 2025-05-12 16:27:46 +08:00
mdbx: merge branch stable
into master
.
This commit is contained in:
commit
52c9ef8807
85
ChangeLog.md
85
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()`.
|
||||
|
||||
Прочие доработки:
|
||||
|
||||
|
@ -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?= <leo@yuriev.ru>
|
||||
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
|
||||
|
||||
|
@ -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;
|
||||
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)
|
||||
|
@ -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 */;
|
||||
|
@ -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));
|
||||
|
Loading…
x
Reference in New Issue
Block a user