Wydanie DBMS libmdbx 0.11.7. Przenieś rozwój do GitFlic po zamknięciu na GitHub

Biblioteka libmdbx 0.11.7 (MDBX) została wydana wraz z implementacją wysokowydajnej, kompaktowej, wbudowanej bazy danych klucz-wartość. Kod libmdbx jest objęty licencją publiczną OpenLDAP. Obsługiwane są wszystkie obecne systemy operacyjne i architektury, a także rosyjski Elbrus 2000.

Wydanie wyróżnia się migracją projektu do usługi GitFlic po tym, jak 15 kwietnia 2022 roku administracja GitHuba bez żadnego ostrzeżenia i wyjaśnienia usunęła libmdbx wraz z szeregiem innych projektów, blokując jednocześnie dostęp wielu programistom związanym z firm objętych amerykańskimi sankcjami. Z punktu widzenia użytkowników wszystkie strony, repozytorium i forki projektu nagle zamieniły się w stronę 404, bez możliwości jakiejkolwiek komunikacji i poznania przyczyn.

Niestety, prawie wszystkie wątki, w których było wiele pytań ze szczegółowymi odpowiedziami, a także wiele dyskusji, przepadły. Utrata tych informacji jest jedyną obiektywną szkodą, jaką administracja GitHuba zdołała wyrządzić projektowi. Częściowe kopie dyskusji pozostają dostępne na Archive.org.

Utrata rozbudowanych scenariuszy CI i infrastruktury (dostępnej dla projektów OpenSource za darmo) zmusiła nas do podjęcia rewizji, ujednolicenia i eliminacji drobnego długu technicznego. Teraz CI został przywrócony w prawie takim samym stopniu, z wyjątkiem testów kompilacji i uruchomienia dla wszystkich wariantów BSD i Solaris. Zazwyczaj po akcjach GitHub nie otrzymywał żadnych wyjaśnień ani powiadomień, poza przypomnieniami o konieczności dokonania płatności i próbami umorzenia pieniędzy.

Od czasu ostatnich wieści o wydaniu libmdbx v0.11.3, oprócz odzyskiwania z akcji GitHub, warto zwrócić uwagę na następujące ulepszenia i poprawki:

  • Dodano obejście wykrytego efektu/defektu niespójności w połączonej pamięci podręcznej strony i bufora w jądrze Linuksa. W systemach, w których pamięć podręczna stron i buforów jest naprawdę połączona, nie ma sensu, aby jądro marnowało pamięć na dwie kopie danych podczas zapisywania do pliku, który jest już zmapowany w pamięci. Dlatego zapisywane dane stają się widoczne poprzez mapowanie 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ż w przypadku odroczonego scalania nadal będziesz musiał nabyć blokady dla list stron, kopiować dane lub dostosowywać PTE. Dlatego też niewypowiedziana zasada spójności obowiązuje od 1989 roku, kiedy w SRV4 pojawiła się ujednolicona pamięć podręczna bufora. Dlatego wykrycie dziwnych awarii w załadowanych scenariuszach wykorzystania libmdbx wymagało dużo pracy. Najpierw odtworzenie problemu, następnie weryfikacja hipotez i testowanie ulepszeń.

    Teraz możemy śmiało powiedzieć, że problem został rzetelnie zidentyfikowany, zlokalizowany i rzetelnie wyeliminowany, pomimo złożoności i specyfiki scenariusza reprodukcji. Dodatkowo działanie mechanizmu obejścia zostało potwierdzone przez jednego z twórców Erigona (Ethereum) i w jego przypadku, na kompilacji debugującej, ochrona została uruchomiona jako regresja w wyniku niepotrzebnego sprawdzenia asercji.

    Należy zauważyć, że w kontekście powszechnego stosowania libmdbx w projektach produkcyjnych zapewnienie niezawodnego działania jest zasadniczo ważniejsze niż ustalenie, czy jest to błąd, czy funkcja i czy można polegać na takiej spójności, a tym bardziej szukanie przyczyny niespójności w jądrze Linuksa. Dlatego tutaj mówimy o rozwiązaniu problemu, który mógł mieć wpływ na użytkowników.

  • Wyeliminowano regresję błędu EXDEV (Cross-device link) podczas kopiowania bazy danych na gorąco bez kompaktowania do innego systemu plików, zarówno poprzez API, jak i za pomocą narzędzia mdbx_copy.
  • Kris Zyp zaimplementował obsługę libmdbx w Deno. Kai Wetlesen zaprojektował opakowanie RPM dla Fedory. David Bouyssié zaimplementował powiązania dla Scali.
  • Naprawiono przetwarzanie wartości określonej przez opcję MDBX_opt_rp_augment_limit podczas przetwarzania dużych transakcji w dużych bazach danych. Wcześniej z powodu błędu mogły zostać wykonane niepotrzebne akcje, co czasami wpływało na wydajność we wdrożeniach Ethereum (Erigon/Akula/Silkworm) i projektach Binance Chain.
  • Naprawiono wiele błędów, w tym w API C++. Naprawiono wiele problemów z kompilacją w rzadkich i egzotycznych konfiguracjach. Pełna lista wszystkich znaczących ulepszeń jest dostępna w ChangeLog.
  • Łącznie wprowadzono 185 zmian w 89 plikach, dodano ≈3300 linii, usunięto ≈4100. Więcej zostało usuniętych głównie w wyniku oczyszczenia już bezużytecznych plików technologicznych powiązanych z GitHubem i usługami zależnymi.

Historycznie rzecz biorąc, libmdbx jest głęboką przeróbką systemu LMDB DBMS i przewyższa swojego przodka pod względem niezawodności, zestawu funkcji i wydajności. W porównaniu do LMDB, libmdbx kładzie duży nacisk na jakość kodu, stabilność API, testowanie i automatyczne kontrole. Dostarczone jest narzędzie do sprawdzania integralności struktury bazy danych z pewnymi możliwościami odzyskiwania.

Z technologicznego punktu widzenia libmdbx oferuje ACID, serializację silnych zmian i nieblokujący odczyt z liniowym skalowaniem pomiędzy rdzeniami procesora. Obsługiwane jest automatyczne kompaktowanie, automatyczne zarządzanie rozmiarem bazy danych i szacowanie zapytań o zakres. Od 2016 roku projekt jest finansowany przez firmę Positive Technologies, a od 2017 roku jest stosowany w jej produktach.

Libmdbx oferuje 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

Dodaj komentarz