Opublikowano wydanie biblioteki libmdbx 0.13.2 (MDBX) z realizacją wysoko wydajnej kompaktowej wbudowanej bazy danych klasy klucz-wartość. Kod libmdbx jest rozpowszechniany 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 wspierane przez entuzjastów powiązania z językami Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala.
Historia libmdbx to głęboka przeróbka bazy danych LMDB, która przewyższa swojego poprzednika pod względem niezawodności, zestawu funkcjonalności i wydajności. W porównaniu do LMDB, libmdbx kładzie duży nacisk na jakość kodu, stabilność pracy API, testowanie i automatyczne kontrole. Dostarczane jest narzędzie do sprawdzania integralności struktury bazy danych z pewnymi możliwościami odzyskiwania. Technologicznie libmdbx oferuje ACID, ścisłą serializację zmian i nieblokujące odczyty z liniowym skalowaniem obciążenia na rdzeniach CPU. Wspierana jest automatyczna kompaktyfikacja, automatyczne zarządzanie rozmiarem bazy danych oraz szacowanie objętości zapytań w zakresie (range query estimation).
Główne zmiany:
- Przyspieszono aktualizację GC przy zwrocie/wkładaniu list stron w skomplikowanych scenariuszach. Poprawiono i aktywowano wcześniej wyłączony eksperymentalny tryb korekty zwrotnej. To zasadniczo poprawiło zbieżność (zmniejszyło liczbę prób ponownych) oraz wyeliminowało defekt prowadzący do 'zapętlenia' podczas zatwierdzania transakcji (z powrotem błędu MDBX_PROBLEM) w rzadkich specyficznych warunkach.
- W skryptach budowania CMake włączono standard C23.
- Dodano makra T dla par funkcji char/wchar_t.
- W API C++ dodano wsparcie dla zagnieżdżonych transakcji zapisujących.
- Zrealizowano przejście na drugą edycję specyfikacji semantycznego wersjonowania (‘Semantic Versioning 2’) i zapewniono eksport informacji o wersji do VERSION.json.
- Aby zapewnić reprodukowalność budów, dodano wsparcie dla zmiennej środowiskowej SOURCE_DATE_EPOCH. Wsparcie dla MDBX_BUILD_TIMESTAMP zostało zachowane, a ta zmienna ma priorytet.
- Dodano możliwość podawania dodatkowych informacji o budowie libmdbx za pomocą opcji MDBX_BUILD_METADATA. Aktualnie podawane informacje są po prostu dołączane do biblioteki jako wartość mdbx_build.metadata, a w przyszłości będą również używane przy formowaniu pakietów itp.
- Dodano logowanie błędów zwracanych z API. Teraz wystarczy ustawić poziom logowania MDBX_LOG_DEBUG (do logowania błędów z wyjątkiem MDBX_NOTFOUND) lub MDBX_LOG_TRACE (do logowania wszystkich błędów oraz MDBX_RESULT_TRUE).
- Zmiana zachowania:
- Dodano metodę mdbx::cursor::get_multiple_samelength() i zmieniono nazwę mdbx::txn::put_multiple_samelength().
- Dla jednorodności API C++ przy wykonywaniu operacji MDBX_GET_MULTIPLE teraz również zwracana jest wartość samego klucza.
- Dla stałych wymiarowych mdbx::env::geometry typ podstawowy zmieniono z bezznakowego size_t na znakowy intptr_t.
- Wybór pomiędzy używaniem ntdll a CRT teraz jest dokonywany tylko po wyraźnym wyłączeniu API C++.
- Zapewnione jest zwalnianie pamięci zablokowanych/przerwanych transakcji odczytu przekazywanych do mdbx_txn_commit(). Umowa API wymaga, aby takie transakcje były zwalniane za pomocą mdbx_txn_abort(), przez co funkcja mdbx_txn_commit() zwracała błąd w takich przypadkach, nie niszcząc samych transakcji. Prowadziło to do wycieków pamięci z powodu błędów w aplikacjach, co skłoniło do zmiany zachowania.
- Użycie makra __deprecated_enum, jeśli jest zdefiniowane.
- Podczas budowy za pomocą CMake wybór standardu języka C jest teraz realizowany z uwzględnieniem CMAKE_C_STANDARD.
Źródło: opennet.ru
