È stata pubblicata la versione della libreria libmdbx 0.13.1 (MDBX) con l'implementazione di un database embedded compatto e ad alte prestazioni di tipo chiave-valore. Il codice di libmdbx è distribuito sotto la licenza Apache 2.0. Supporta tutti i sistemi operativi e le architetture più recenti, inclusi i processori russi Elbrus 2000. Per libmdbx è disponibile un'API avanzata per C++, insieme a binding supportati da appassionati per i linguaggi Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno e Scala.
Storicamente, libmdbx è una profonda revisione 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 verifica 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 letture non bloccanti con scalabilità lineare in base ai core della CPU. Supporta l'autocompattazione, la gestione automatica delle dimensioni del database e la stima del volume delle query per intervallo.
Principali modifiche:
- Modifica della licenza del codice da OpenLDAP Public License a Apache 2.0.
- Espansione dell'API dei cursori con operazioni di posizionamento più intuitive e ovvie, simili 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 al fine di ridurre le spese generali. Le funzioni mdbx_cursor_scan() e mdbx_cursor_scan_from() sono state introdotte per la scansione delle tabelle utilizzando predicati funzionali e riducendo le spese generali associate.
- Riprogettazione dei cursori per unificare il comportamento, rendere il codice più regolare, ridurre il numero di ramificazioni e operazioni macchinistiche.
- Funzionalità della utility mdbx_chk trasferita all'interno della libreria come funzione mdbx_env_chk() per controllare l'integrità della struttura del database, inclusa 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 adiacenti in GC.
- Sostanziale riduzione delle spese generali per l'avvio delle transazioni in scenari con un gran numero di manici DBI, grazie all'inizializzazione posticipata/oziosa degli elementi delle tabelle di servizio. Include anche un meccanismo di supporto per set sparsi di manici DBI, gestito dall'opzione di compilazione MDBX_ENABLE_DBI_SPARSE, che è abilitata per impostazione predefinita.
- Riduzione delle spese generali per l'apertura dei manici DBI. Include anche un meccanismo di rilascio posticipato e supporto per un'apertura rapida senza utilizzo di blocchi, gestito dall'opzione di compilazione MDBX_ENABLE_DBI_LOCKFREE, che è abilitata per impostazione predefinita.
- Supporto per il "parcheggio" delle transazioni di lettura, consentendo la loro espulsione per elaborare vecchi snapshot MVCC e prevenire problemi causati dall'interruzione del riciclo dei rifiuti. Il meccanismo di parcheggio e espulsione delle transazioni parcheggiate è sia un'aggiunta che un'alternativa più semplice al callback Handle-Slow-Readers. Per comodità, le funzioni mdbx_txn_park() e mdbx_txn_unpark() hanno argomenti aggiuntivi che permettono di richiedere un "unparking" automatico delle transazioni parcheggiate e il riavvio delle transazioni espulse. Nell'utility mdbx_copy sono state aggiunte opzioni corrispondenti -d e -p.
- Supporto per il ripristino dell'ambiente di lavoro del database in un processo figlio dopo un fork/splitting del processo tramite mdbx_env_resurrect_after_fork().
- Supporto per la rinomina delle tabelle tramite mdbx_dbi_rename() e mdbx_dbi_rename2(). Aggiunta la funzione mdbx_enumerate_tables() per ottenere informazioni sulle tabelle utente nominate.
- Modalità di operazione MDBX_NOSTICKYTHREADS invece di MDBX_NOTLS per semplificare l'integrazione con thread leggeri/multiplexando insieme le transazioni nei thread del sistema operativo.
- Per l'identificazione del database è stato aggiunto un UUID disponibile nel campo mi_dxbid della struttura MDBX_envinfo, ottenuta tramite mdbx_env_info_ex(). È stata implementata l'ottenzione di informazioni sul database senza aprirlo tramite mdbx_preopen_snapinfo().
- Supporto per le funzioni di logging callback senza funzionalità vprintf(), facilitando notevolmente l'uso del logging in binding 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".
- Dichiarazione obsoleta delle opzioni MDBX_COALESCE e MDBX_NOTLS. Sostituzione dell'opzione di compilazione MDBX_USE_VALGRIND con l'uso comune ENABLE_MEMCHECK.
Fonte: opennet.ru
