Dopo tre mesi di sviluppo, è stata rilasciata la libreria libmdbx 0.10.0 (MDBX) con l'implementazione di un database incorporato, compatto e ad alte prestazioni di tipo chiave-valore. Il codice di libmdbx è distribuito sotto la licenza OpenLDAP Public License. libmdbx è una profonda revisione del DBMS LMDB e, secondo gli sviluppatori, supera il suo antenato in termini di affidabilità, set di funzionalità e prestazioni. Si afferma che libmdbx sia fino al 20% più veloce di LMDB negli scenari CRUD e fino al 30% più veloce, se durante la compilazione di libmdbx si disabilita il controllo interno per raggiungere un livello comparabile a LMDB.
Libmdbx offre ACID, una rigorosa serializzazione delle modifiche e lettura non bloccante con scalabilità lineare su core CPU. In libmdbx viene prestata grande attenzione alla qualità del codice, al funzionamento stabile dell'API, ai test e ai controlli automatici. È supportata l'autocompattazione, la gestione automatica delle dimensioni del database, un formato unificato per le build a 32 e 64 bit e la stima del volume delle query per intervallo (range query estimation). È fornuto uno strumento per il controllo dell'integrità della struttura del database con alcune funzionalità di ripristino. Dal 2016, il progetto è finanziato dalla Positive Technologies e dal 2017 è utilizzato nei suoi prodotti, mentre le sanzioni imposte dal governo degli Stati Uniti contro la Positive Technologies non hanno alcun impatto significativo.
Le principali novità, aggiornamenti e correzioni aggiunti dopo l'ultima versione:
- Sono disponibili i binding per Ruby di Mahlon E. Smith e una versione di prova dei binding per Python di Noel Kuntze, aggiornati i binding per GoLang di Aleksej Shorov.
- Per la modalità «MDBX_WRITEMAP», quando i dati del database vengono modificati direttamente in RAM, è stato implementato un "spill over" trasparente su disco delle pagine modificate del database. Ora, dopo il completamento di ogni operazione, tali pagine sono immediatamente pronte per essere scritte su disco e il kernel del sistema operativo può autonomamente scrivere le pagine modificate su disco, mentre la fissazione della transazione non richiederà la loro modifica. Di conseguenza, in scenari ad alta richiesta con insufficiente RAM, il volume delle operazioni su disco può ridursi fino a 2 volte.
- È stata implementata la rimozione delle vecchie copie shadow delle pagine modificate, privilegiando l'eliminazione delle pagine con valori grandi/lunghi, che nella stragrande maggioranza degli scenari vengono modificati solo una volta per transazione. Di conseguenza, si riduce il traffico con il disco e si aumenta le prestazioni in scenari con transazioni molto grandi.
- È stata implementata una modalità «intelligente» di suddivisione delle pagine durante l'inserimento delle chiavi. Ora, durante l'inserimento di sequenze ordinate, viene automaticamente garantito il completo riempimento delle pagine, mentre negli altri casi si ottiene un bilanciamento più ottimale dell'albero. Di conseguenza, in media, le pagine del database vengono riempite in modo più ottimale, e l'albero B risulta più bilanciato, il che influisce positivamente sulle prestazioni.
- È stata aggiunta la statistica delle operazioni sulle pagine, il che consente di valutare con precisione il costo delle operazioni di modifica sul database.
- Sono stati risolti oltre dieci difetti e bug, tra cui: problemi di compilazione con MinGW, utilizzo di `std::filesystem::path` in iOS <= 13.0, compilazione destinata a versioni più vecchie di Windows, ecc.
- In totale, sono state apportate oltre 200 modifiche a 66 file, aggiunte circa 6500 righe, rimosse circa 4500.
Si desidera evidenziare in particolare la scelta del progetto Turbo-Geth (turbo-fork di Go-Ethereum) di utilizzare libmdbx come nuovo backend di archiviazione, e ringraziare il team del progetto (in particolare Alexey Sharov, Artem Vorotnikov e Alexey Akhunov) per il grande aiuto nei test in scenari di utilizzo estremi. In particolare, è stato scoperto e risolto un difetto nella gestione della lettura anticipata/cache, che portava a una degradazione delle prestazioni in scenari difficili da riprodurre con grandi database.
Fonte: opennet.ru
