Opublikowano wydanie biblioteki libmdbx 0.13.7 (MDBX) z realizacją wydajnej, kompaktowej, wbudowanej bazy danych klasy klucz-wartość. Kod libmdbx jest udostępniany na licencji Apache 2.0. Obsługiwane są wszystkie aktualne systemy operacyjne i architektury, w tym rosyjski Elbrus 2000. Dla libmdbx oferowane jest rozwinięte API dla C++, a także dostępne przez entuzjastów powiązania z językami Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala. Spośród projektów wykorzystujących libmdbx, można wymienić Isar, Erigon i Reth, a także rozwiązania 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:
- Usunięto krytyczny błąd w funkcjonalności mdbx_env_resurrect_after_fork() przy użyciu semaforów SysV. Błąd objawiał się tylko po utworzeniu procesu potomnego za pomocą fork() w trakcie wykonywania pisarskiej transakcji, co prowadziło do błędnego działania semaforów i różnorodnych błędów, włącznie z uszkodzeniem bazy danych. Problem istniał od chwili wprowadzenia mdbx_env_resurrect_after_fork() i dotyczył macOS oraz platform POSIX przy kompilacji z opcją MDBX_LOCKING=5.
- Usunięto problem w API kopiowania bazy danych, który objawiał się na systemach POSIX innych niż Linux (głównie w macOS), a także w pewnych przypadkach przy lokalizacji pliku docelowego na nielokalnym systemie plików. Problem prowadził do zwrotu błędu EWOULDBLOCK/EAGAIN, co było spowodowane niedopatrzeniem/kolizją blokad fcntl(F_SETLK) i flock() w jądrze systemu operacyjnego. Przeprojektowano obsługę błędów przechwytywania blokad plików w API kopiowania na systemach POSIX.
- Usunięto błąd, który prowadził do niespodziewanego zwrotu MDBX_BAD_DBI przy równoczesnym uruchamianiu kilku transakcji w jednym procesie po otwarciu bazy danych.
- Usunięto błąd, który prowadził do niespodziewanego zwrotu MDBX_DBS_FULL podczas ponownego otwierania już otwartych tabel przy osiągniętym limicie otwartych deskryptorów DBI.
- Naprawiono błąd kompilacji dla platformy Android przy wyraźnym definiowaniu _FILE_OFFSET_BITS.
- Naprawiono błąd użycia ENOMEM zamiast MDBX_ENOMEM, co mogło psuć kompilację na platformach nie-POSIX/Windows, w zależności od konfiguracji i/lub wersji SDK.
- Poprawiono lub usunięto kilka nieprawidłowych asercji, które powodowały awarie wersji debug w specyficznych sytuacjach. Głównie w kodzie funkcji txn_end(), txn_lock() i txn_unlock() zarówno na Windows, jak i na POSIX.
- Usunięto nieistotne ostrzeżenia MSVC. Wyłączono ostrzeżenia C5286 i C5287.
- Dopracowano logikę rezygnacji z używania blokad OFD na platformach POSIX. Teraz oprócz EINVAL uwzględniane są dodatkowe kody błędów (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), co pozwoli zbudowanej bibliotece na działanie w niektórych przypadkach, gdy aktualne jądro/kontener/emulator nie obsługuje wymaganych wywołań systemowych.
- Do testowego frameworka dodano wsparcie dla opcji „—numa ” w celu powiązania testu stochastycznego z węzłem NUMA. W skrypcie battery/tmux dodano wyraźny podział według węzłów NUMA, co znacznie zwiększyło efektywność podczas testowania na maszynach NUMA.
- W skrypcie stochastycznym zrealizowano losową kolejność uruchamiania poszczególnych testów.
Źródło: opennet.ru
