Wydano bibliotekę libmdbx 0.11.7 (MDBX) z implementacją wysokowydajnej, kompaktowej bazy danych typu klucz-wartość. Kod libmdbx jest rozpowszechniany na licencji OpenLDAP Public License. Wspierane są wszystkie aktualne systemy operacyjne i architektury, a także rosyjski Elbrus 2000.
Wydanie jest godne uwagi migracją projektu na serwis GitFlic po tym, jak 15 kwietnia 2022 roku administracja GitHub bez jakichkolwiek ostrzeżeń i wyjaśnień usunęła libmdbx wraz z wieloma innymi projektami, jednocześnie blokując dostęp wielu programistom związanym z firmami objętymi sankcjami USA. Z perspektywy użytkowników, wszystkie strony, repozytorium i forki projektu nagle zamieniły się w stronę „404”, bez możliwości jakiejkolwiek komunikacji i wyjaśnienia przyczyn.
Niestety utracono prawie wszystkie zgłoszenia, w których było wiele pytań z szczegółowymi odpowiedziami, a także nieco dyskusji. Utrata tych informacji jest jedyną obiektywną szkodą, jaką administracja GitHub udało się zadać projektowi. Częściowo kopie dyskusji pozostają dostępne w archiwum archive.org.
Utrata zbudowanych scenariuszy CI i infrastruktury (dostępnej dla projektów OpenSource bezpłatnie) zmusiła do rewizji, unifikacji i usunięcia niewielkiego długu technologicznego. Teraz CI został przywrócony prawie w poprzedniej formie, z wyjątkiem kompilacji i testów dla wszystkich wariantów BSD i Solaris. Co ciekawe, po działaniach ze strony GitHub nie wpłynęły żadne wyjaśnienia ani powiadomienia, z wyjątkiem przypomnienia o konieczności opłaty i prób pobrania pieniędzy.
Od momentu ostatnich wiadomości o wydaniu libmdbx v0.11.3, oprócz przywracania po działaniach GitHub, należy zauważyć następujące poprawki i ulepszenia:
- Dodano obejście wykrytego efektu/defektu niekoherencji w połączonym cache'u stron i buforów w jądrze Linux. W systemach, gdzie cache stron i buforów jest rzeczywiście połączony, jądro nie ma sensu tracić pamięci na dwie kopie danych podczas zapisywania do już załadowanego do pamięci pliku. Dlatego zapisane dane stają się widoczne przez mapowanie w pamięci przed zakończeniem wywołania systemowego write(), nawet jeśli dane nie zostały jeszcze zapisane na dysku.
Ogólnie rzecz biorąc, inne zachowanie nie jest racjonalne, ponieważ przy opóźnionym scalaniu i tak będzie konieczne zajęcie blokad dla list stron, skopiowanie danych lub korekta PTE. Dlatego niepisana zasada spójności obowiązywała od 1989 roku, kiedy to w SRV4 pojawiła się zintegrowana pamięć podręczna. W związku z tym wykrycie dziwnych awarii w obciążonych scenariuszach korzystania z libmdbx wymagało wielu prac. Najpierw nad reprodukcją problemu, a następnie nad weryfikacją hipotez i sprawdzaniem ulepszeń.
Obecnie można z całą pewnością powiedzieć, że problem został wiarygodnie zidentyfikowany, zlokalizowany i niezawodnie rozwiązany, mimo całej złożoności i specyfiki scenariusza reprodukcji. Dodatkowo działanie mechanizmu omijania zostało potwierdzone przez jednego z programistów Erigon (Ethereum), w jego przypadku w wersji debug do działania zabezpieczenia objawiało się regresją z powodu nadmiernej kontroli assercji.
Należy zauważyć, że w kontekście szerokiego zastosowania libmdbx w projektach roboczych, zapewnienie niezawodności działania jest zasadniczo ważniejsze niż ustalanie, czy to błąd, czy cecha, oraz czy można polegać na takiej spójności, a tym bardziej nie szukanie przyczyn niespójności wewnątrz jądra Linux. Dlatego chodzi o rozwiązanie problemu, który mógł dotyczyć użytkowników.
- Wyeliminowano regres pojawiania się błędu EXDEV (Cross-device link) podczas gorącego kopiowania bazy danych bez kompresji na inną system plików, zarówno przez API, jak i narzędzie mdbx_copy.
- Kris Zyp zaimplementował wsparcie dla libmdbx w Deno. Kai Wetlesen zrealizował pakowanie RPM dla Fedory. David Bouyssié opracował powiązania dla Scali.
- Poprawiono przetwarzanie wartości określanej przez opcję MDBX_opt_rp_augment_limit przy przetwarzaniu ogromnych transakcji w dużych bazach danych. Wcześniej przez błąd mogły być podejmowane zbędne działania, co czasami wpływało na wydajność w realizacjach Ethereum (Erigon/Akula/Silkworm) i projektach Binance Chain.
- Naprawiono wiele niedociągnięć, w tym w API C++. Wyeliminowano wiele problemów ze kompilacją w rzadkich i egzotycznych konfiguracjach. Pełna lista wszystkich znaczących poprawek jest dostępna w ChangeLog.
- Ogółem wprowadzono 185 zmian w 89 plikach, dodano ≈3300 linii, usunięto ≈4100. Większość usunięć wynika z oczyszczenia z już niepotrzebnych plików technologicznych związanych z GitHubem i zależnymi usługami.
Historia libmdbx jest głębokim przetworzeniem bazy danych LMDB i przewyższa swojego poprzednika pod względem niezawodności, zestawu możliwości i wydajności. W porównaniu z LMDB, libmdbx kładzie duży nacisk na jakość kodu, stabilną pracę API, testowanie i automatyczne kontrole. Dostarczana jest narzędzie do sprawdzania integralności struktury bazy danych z pewnymi możliwościami przywracania.
Technologicznie libmdbx oferuje ACID, ścisłą serializację zmian oraz nieblokujące czytanie z liniowym skalowaniem w odniesieniu do rdzeni CPU. Obsługuje automatyczną kompaktyfikację, automatyczne zarządzanie rozmiarem bazy danych, szacowanie objętości zapytań w oparciu o zakres (range query estimation). Od 2016 roku projekt jest finansowany przez firmę Positive Technologies i od 2017 roku wykorzystywany jest w jej produktach.
Dla libmdbx oferowane jest rozwinięte API C++, a także wspierane przez entuzjastów powiązania z językami Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala.
Źródło: opennet.ru
