È stato rilasciato il library libmdbx 0.11.7 (MDBX) con l'implementazione di un database integrato compatto e ad alte prestazioni di tipo chiave-valore. Il codice libmdbx è distribuito con licenza OpenLDAP Public License. Sono supportati tutti i sistemi operativi e architetture attuali, compreso l'Elbrus 2000 russo.
Il rilascio si distingue per la migrazione del progetto al servizio GitFlic, dopo che il 15 aprile 2022 l'amministrazione di GitHub ha rimosso senza preavviso e senza spiegazioni libmdbx insieme a molti altri progetti, bloccando contemporaneamente l'accesso a numerosi sviluppatori associati a aziende soggette a sanzioni statunitensi. Dal punto di vista degli utenti, tutte le pagine, il repository e i fork del progetto sono improvvisamente diventati pagine «404», senza possibilità di comunicazione o chiarimento delle motivazioni.
Purtroppo, sono stati persi quasi tutti gli issues, in cui vi erano molte domande con risposte dettagliate, così come numerose discussioni. La perdita di queste informazioni rappresenta l'unico danno oggettivo che l'amministrazione di GitHub è riuscita a infliggere al progetto. Parte delle copie delle discussioni rimangono disponibili nell'archivio archive.org.
La perdita di script CI configurati e dell'infrastruttura (disponibile gratuitamente per i progetti OpenSource) ha obbligato a una revisione, unificazione e riduzione del debito tecnico. Attualmente, il CI è stato ripristinato quasi come prima, ad eccezione della build e dei test di esecuzione per tutte le versioni di BSD e Solaris. È caratteristico che, dopo le azioni da parte di GitHub, non siano arrivate spiegazioni o notifiche, a parte il promemoria per il pagamento e i tentativi di addebitare denaro.
Dall'ultima notizia sul rilascio di libmdbx v0.11.3, oltre al ripristino dopo le azioni di GitHub, vale la pena notare i seguenti miglioramenti e correzioni:
- È stata aggiunta una soluzione all'effetto/difetto di incoerenza rilevato nel cache unificato delle pagine e dei buffer nel kernel Linux. Nei sistemi dove il cache di pagine e buffer è effettivamente unificato, non ha senso per il kernel allocare memoria per due copie di dati durante la scrittura in un file già mappato in memoria. Pertanto, i dati scritti diventano visibili tramite il mapping in memoria prima del completamento della chiamata di sistema write(), anche se i dati non sono ancora stati scritti sul disco.
In definitiva, un comportamento diverso non è razionale, poiché con la fusione differita dovrà comunque essere acquisita una lock per le liste di pagina, copiare dati o correggere PTE. Pertanto, la regola non ufficiale di coerenza è entrata in vigore dal 1989, quando in SRV4 è apparso il unified buffer cache. Di conseguenza, la scoperta di anomalie in scenari di uso intensivo di libmdbx ha richiesto un notevole lavoro. Prima per la riproduzione del problema, poi per la verifica delle ipotesi e il controllo delle modifiche.
Ora si può affermare con certezza che il problema è stato identificato in modo attendibile, localizzato e risolto in modo affidabile, nonostante la complessità e la specificità dello scenario di riproduzione. Inoltre, il lavoro del meccanismo di bypass è stato confermato da uno degli sviluppatori di Erigon (Ethereum), nel suo caso, su una build di debug, l'attivazione della protezione si manifestava come un regressa a causa di un errore di assert.
Va notato che, nel contesto di un ampio utilizzo di libmdbx in progetti operativi, è molto più importante garantire un funzionamento affidabile, piuttosto che determinare se si tratti di un «errore» o di una «caratteristica», e se si possa contare su tale coerenza, tanto meno cercare le cause di incoerenza all'interno del kernel Linux. Pertanto, qui si tratta di risolvere un problema che poteva interessare gli utenti.
- Eliminato il regress del verificarsi dell'errore EXDEV (Cross-device link) durante la copia a caldo del DB senza compattazione su un altro file system, sia tramite API che utilizzando lo strumento mdbx_copy.
- Kris Zyp ha implementato il supporto per libmdbx in Deno. Kai Wetlesen ha preparato il pacchetto RPM per Fedora. David Bouyssié ha realizzato i collegamenti per Scala.
- Corretto il trattamento del valore impostato dall'opzione MDBX_opt_rp_augment_limit quando si gestiscono enormi transazioni in grandi DB. In precedenza, a causa di un errore, si potevano eseguire operazioni superflue, che a volte influivano sulle prestazioni nelle implementazioni di Ethereum (Erigon/Akula/Silkworm) e nei progetti Binance Chain.
- Corretto un gran numero di imperfezioni, incluso nell'API C++. Risolti vari problemi di compilazione in configurazioni rare ed esotiche. Un elenco completo di tutte le modifiche significative è disponibile nel ChangeLog.
- In totale, sono state apportate 185 modifiche in 89 file, aggiunte ≈3300 righe, eliminate ≈4100. Maggiori eliminazioni sono state effettuate principalmente a causa della rimozione di file tecnologici già inutili legati a GitHub e servizi dipendenti.
Historicamente, libmdbx è una profonda revisione del DBMS LMDB e supera il suo predecessore per affidabilità, funzionalità e prestazioni. Rispetto a LMDB, in libmdbx viene prestata particolare attenzione alla qualità del codice, al funzionamento stabile dell'API, al testing e ai controlli automatici. È fornuto uno strumento per la verifica dell'integrità della struttura del database con alcune capacità di recupero.
Dal punto di vista tecnologico, libmdbx offre ACID, stretta serializzazione delle modifiche e lettura non bloccante con scalabilità lineare sui core della CPU. Supporta l'autocompattazione, la gestione automatica delle dimensioni del DB, la stima del volume delle query per intervallo (range query estimation). Dal 2016, il progetto è finanziato dall'azienda Positive Technologies e dal 2017 è utilizzato nei suoi prodotti.
Per libmdbx è disponibile un'API C++ avanzata, oltre a binding supportati dagli appassionati per i linguaggi Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala.
Fonte: opennet.ru
