Opublikowano wersję biblioteki libmdbx 0.13.6 (MDBX) z realizacją wysoko wydajnej, kompaktowej bazy danych typu klucz-wartość. Kod libmdbx jest objęty licencją Apache 2.0. Obsługiwane są wszystkie aktualne systemy operacyjne i architektury, a także rosyjski Elbrus 2000. Dla libmdbx oferowane jest rozwinięte API dla C++, a także wspierane przez entuzjastów powiązania z językami Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno i Scala. Z projektów wykorzystujących libmdbx można wymienić Isar, Erigon i Reth, a także opracowania firm StarkWare i Positive Technologies.
Historicznie libmdbx jest głęboką przeróbką DBMS LMDB i przewyższa swojego przodka pod względem niezawodności, funkcji i wydajności. W porównaniu do LMDB, w libmdbx dużą uwagę poświęcono jakości kodu, stabilności API, testowaniu i automatycznym kontrolom. Dostarczane narzędzie do weryfikacji integralności struktury bazy danych oferuje także pewne możliwości przywracania. Technologicznie libmdbx zapewnia ACID, ścisłą serializację zmian i nieblokujące odczyty z liniowym skalowaniem po rdzeniach CPU. Obsługiwane jest automatyczne kompresowanie, automatyczne zarządzanie rozmiarem bazy danych oraz oszacowanie objętości zapytań w zakresie (range query estimation).
Główne zmiany:
- Zmiana zachowania: W przypadku niemożności odwiązania kursora od jego aktualnej transakcji, funkcja mdbx_cursor_bind() teraz zwraca MDBX_EINVAL zamiast MDBX_BAD_TXN.
- Aby uniknąć potencjalnych problemów, wyłączono użycie copy_file_range() na jądrze Linux 5.3 — 5.18.
- Rzucanie std::invalid_argument teraz odbywa się z wyraźnym komunikatem MDBX_EINVAL.
- Wyeliminowano regresję przy używaniu kursorów dla DBI=0 (aka GC/FreeDB) w transakcjach czytających.
- Wyeliminowano regresję w postaci błędu EAGAIN podczas kopiowania bazy danych na NFS i CIFS/SMB.
- Podczas dalszego rozwoju API w funkcji kopiowania dodano przechwytywanie blokady plików zarówno przez fcntl(), jak i flock(). Jednak w zależności od wersji lokalnego jądra, wersji zdalnego serwera NFS i opcji montowania, mogło to prowadzić do zwracania błędu POSIX EAGAIN (11 na większości platform, w tym Linux).
- Naprawiono błąd merge/rebase w mdbx_txn_release_all_cursors_ex(), co mogło prowadzić do późniejszych nieoczekiwanych błędów MDBX_EBADSIGN i wycieków pamięci.
- Naprawiono sprawdzenie asercji w ścieżce zakończenia zagnieżdżonych transakcji.
- Wyeliminowano możliwość zwrócenia nieoczekiwanego błędu MDBX_BUSY z mdbx_txn_lock(dont_wait=false).
- Dla zgodności z GCC 15.x w trybie C23 zmieniono kolejność podawania atrybutów funkcji.
Źródło: opennet.ru
