È stata pubblicata la versione della libreria libmdbx 0.13.1 (MDBX) con l'implementazione di un database incorporato compatto ad alte prestazioni di tipo chiave-valore. Il codice di libmdbx è distribuito sotto la licenza Apache 2.0. Sono supportati tutti i sistemi operativi e architetture attuali, inclusi gli Elbrus 2000 russi. Per libmdbx è disponibile un'API avanzata per C++, insieme a binding supportati dagli appassionati per i linguaggi Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, Scala.
Storicamente, libmdbx è una revisione profonda del DBMS LMDB e supera il suo predecessore in termini di affidabilità, funzionalità e prestazioni. Rispetto a LMDB, libmdbx pone grande attenzione alla qualità del codice, al funzionamento stabile dell'API, ai test e ai controlli automatici. Viene fornuto uno strumento di controllo dell'integrità della struttura del database con alcune funzionalità di recupero. Dal punto di vista tecnologico, libmdbx offre ACID, una rigorosa serializzazione delle modifiche e una lettura non bloccante con scalabilità lineare su core CPU. È supportata l'autocompattazione, la gestione automatica delle dimensioni del database, e la stima dei voluminosi campioni per intervallo (range query estimation).
Variazioni principali:
- Cambiamento della licenza del codice da OpenLDAP Public License a Apache 2.0.
- Espansione dell'API dei cursori con operazioni di posizionamento più comode e ovvie, analoghe alle condizioni <, =, > sia per le chiavi che per le coppie chiave-valore. Sono state aggiunte le funzioni mdbx_cursor_unbind() e mdbx_txn_release_all_cursors() per una gestione flessibile dei cursori in scenari di riutilizzo per ridurre l'overhead. Le funzioni mdbx_cursor_scan() e mdbx_cursor_scan_from() per la scansione delle tabelle utilizzando un predicato funzionale e riducendo l'overhead associato.
- Revisione dei cursori per unificare il comportamento, avere un codice più regolare, e ridurre il numero di ramificazioni e operazioni macchina.
- Trasferimento della funzionalità dell'utilità mdbx_chk all'interno della libreria sotto forma di funzione mdbx_env_chk() per il controllo dell'integrità della struttura del database, serbando anche la logica dell'applicazione.
- Opzione MDBX_opt_gc_time_limit per un controllo più flessibile del tempo speso nella ricerca di sequenze di pagine libere contigue nel GC.
- Un notevole abbattimento dei costi operativi per l'avvio delle transazioni in scenari con un gran numero di handle DBI, grazie all'inizializzazione posticipata/ pigra degli elementi delle tabelle ausiliarie. In particolare, il meccanismo di supporto per set sparsi di handle DBI gestito dall'opzione di compilazione MDBX_ENABLE_DBI_SPARSE, attivata per impostazione predefinita.
- Riduzione dei costi per l'apertura degli handle DBI. In particolare, il meccanismo di rilascio posticipato e supporto per percorsi rapidi di apertura senza utilizzo di blocchi, gestito dall'opzione di compilazione MDBX_ENABLE_DBI_LOCKFREE, attivata per impostazione predefinita.
- Supporto per il "parcheggio" delle transazioni di lettura con la loro sostituzione per rielaborare vecchie istantanee MVCC e prevenire problemi causati dall'interruzione della rielaborazione della spazzatura. Il meccanismo di parcheggio e sostituzione delle transazioni parcheggiate è sia un complemento che un'alternativa più semplice all'invocazione Handle-Slow-Readers. Per comodità, le funzioni mdbx_txn_park() e mdbx_txn_unpark() hanno argomenti aggiuntivi che consentono di richiedere la "disparcheggio" automatica delle transazioni parcheggiate e il riavvio delle transazioni sostituite. Nella utility mdbx_copy sono state aggiunte le opzioni corrispondenti -d e -p.
- Supporto per il ripristino di un ambiente di lavoro aperto con il database in un processo figlio dopo la biforcazione/suddivisione del processo tramite mdbx_env_resurrect_after_fork().
- Supporto per la rinominazione delle tabelle tramite mdbx_dbi_rename() e mdbx_dbi_rename2(). È stata aggiunta la funzione mdbx_enumerate_tables() per ottenere informazioni sulle tabelle utente nominate.
- Funzionamento della modalità MDBX_NOSTICKYTHREADS invece di MDBX_NOTLS per semplificare l'integrazione con thread leggeri/policies di multiplexing insieme alle transazioni dei thread del sistema operativo.
- Per identificare il database è stato aggiunto un UUID disponibile nel campo mi_dxbid della struttura MDBX_envinfo, ottenuta tramite mdbx_env_info_ex(). È stata implementata la possibilità di ottenere informazioni sul database senza aprirlo tramite mdbx_preopen_snapinfo().
- Supporto per le funzioni di registrazione dei callback senza la funzionalità vprintf(), che semplifica notevolmente l'uso della registrazione nelle interfacce con altri linguaggi di programmazione.
- Aggiunta all'API delle funzioni mdbx_txn_copy2pathname() e mdbx_txn_copy2fd().
- Ristrutturazione del codice sorgente con refactoring.
- Utilizzo del termine "tabella" invece di "subDb".
- Annuncio delle opzioni obsolete MDBX_COALESCE e MDBX_NOTLS. Sostituzione dell'opzione di compilazione MDBX_USE_VALGRIND con la comune ENABLE_MEMCHECK.
Fonte: opennet.ru
