De release van de libmdbx bibliotheken 0.10.4 (MDBX) heeft plaatsgevonden, met de implementatie van een hoogpresterende compacte embedded key-value database, en de bijbehorende bibliotheek libfpta 0.3.9 (FPTA), die een tabelweergave van gegevens met secundaire en samengestelde indices bovenop MDBX implementeert. Beide bibliotheken worden verspreid onder door OSI goedgekeurde licenties. Alle huidige besturingssystemen en architecturen worden ondersteund, evenals de Russische Elbrus 2000.
Historisch gezien is libmdbx een grondige herwerking van de databasebeheerder LMDB en overtreft zijn voorouder qua betrouwbaarheid, mogelijkheden en prestaties. In vergelijking met LMDB wordt in libmdbx veel aandacht besteed aan de codekwaliteit, de stabiele werking van de API, testen en automatische controles. Er is een hulpprogramma voor het controleren van de integriteit van de database-structuur met enkele herstelmogelijkheden meegeleverd.
Technologisch biedt libmdbx ACID, strikte serialisatie van wijzigingen en niet-blokkerend lezen met lineaire schaling over CPU-kernen. Automatische compactificatie, automatische databasegroottebeheer en schatting van het volume van selecties op basis van bereik (range query estimation) worden ondersteund. Sinds 2016 worden projecten gefinancierd door Positive Technologies en vanaf 2017 in hun producten gebruikt.
Voor libmdbx is er een C++ API beschikbaar, evenals door enthousiastelingen ondersteunde bindings voor de talen Rust, Haskell, Python, NodeJS, Ruby, Go en Nim. Voor libfpta is alleen de beschrijving van de API publiekelijk beschikbaar in de vorm van een headerbestand in C/C++.
De belangrijkste vernieuwingen, verbeteringen en bugfixes die zijn toegevoegd na het vorige nieuwsbericht van 9 mei:
- De mogelijkheid voor reproduceerbare builds is verzekerd.
- Een bug is verholpen waardoor er bij zeer zeldzame omstandigheden een eindeloze lus/ophangingen konden optreden tijdens het vastleggen van een transactie. Dit probleem werd ontdekt door specialisten van Positive Technologies tijdens intern testen van hun producten.
- Tests zijn verbeterd en testscenario's zijn uitgebreid om alle bereikbare niet-isomorfe toestanden van de paginatree en de inhoud van GC binnen de database te controleren.
- In de C++ API is een overbodige "noexcept" gecorrigeerd, zijn extra overloads voor de methode "cursor::erase()" toegevoegd, en is de implementatie van buffers ontdaan van het gebruik van "std::string" voor uitlijning (relevantie voor CLANG libstdc++).
- Een regressie in het algoritme voor het afspelen van vuile pagina's (selectieve verdringing van gewijzigde databasepagina's) is verholpen, wat zich uitte in een zeldzame onverwachte fout MDBX_PROBLEM bij het wijzigen van gegevens in enorme transacties.
- Er is een controle uitgevoerd met fases, met de toevoeging van een aantal controles om de stabiliteit te waarborgen bij opzettelijke beschadiging van de database.
- Kleine waarschuwingen van UndefinedBehaviorSanitizer en Coverity Scan-problemen zijn verholpen.
- De controle op de verouderde en al niet meer gebruikte interne vlag 'P_DIRTY' in geneste pagina's binnen database-afbeeldingen die zijn gemaakt met oudere versies van de bibliotheek is gecorrigeerd.
- In de CMake-scripts is de zoektocht naar de compilercomponenten die nodig zijn voor LTO (link-time optimization) verbeterd.
- Het maximale aantal gelijktijdige lezers is verhoogd tot 32767.
- De prestaties bij gebruik van Valgrind en AddressSanitizer zijn versneld.
- Op Windows is het recursieve gebruik van SRW-lock bij het werken in de modus MDBX_NOTLS (zonder gebruik van thread local storage) verholpen, er is een fix voor de generatie van bootid bij wijziging van de systeemtijd aangebracht, WSL1 en WSL2 zijn beter gedetecteerd en er is een mogelijkheid toegevoegd om de database te openen op Plan 9, gemonteerd via DrvFS.
- In totaal zijn er meer dan 160 wijzigingen aangebracht in 57 bestanden, ongeveer 5000 regels toegevoegd en ongeveer 2500 verwijderd.
Een speciale dank gaat uit naar het team van het Erigon-project (Ethereum-ecosysteem) voor hun hulp bij het testen in extreme gebruiksscenario's. Opmerkelijk is dat er in vijf maanden sinds de release van libmdbx v0.10.0, met een databasevolume van 1-2 TB in elke Erigon-installatie (gebruikte op 7% van de Ethereum-knooppunten), slechts drie meldingen van databasebeschadiging zijn binnengekomen, die allemaal het gevolg waren van externe oorzaken en niet van softwarefouten: in twee gevallen waren de redenen geheugenfouten en in het derde geval een fout in het resetten van gegevens in een specifieke configuratie van de opslagsubstructuur met gebruik van BTRFS.
Bron: opennet.ru
