È stato pubblicato il rilascio della libreria libmdbx 0.13.3 (MDBX) con l'implementazione di un database incorporato ad alte prestazioni e compatto di tipo chiave-valore. Il codice di libmdbx è distribuito con licenza Apache 2.0. Sono supportati tutti i sistemi operativi e architetture attuali, oltre al russo Elbrus 2000. Per libmdbx è disponibile un'API avanzata per C++, oltre a binding supportati dagli entusiasti 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:
- Il ramo 0.13.x ha ottenuto lo stato di stabile. È iniziato lo sviluppo del ramo 0.14.x.
- Nell'API C è stata aggiunta la funzione mdbx_cursor_count_ex(), che consente di ottenere sia il numero di valori multipli corrispondenti alla chiave corrente, sia informazioni sull'albero nidificato che memorizza questi valori.
- Nell'API C++ è stato aggiunto il metodo mdbx::txn::make_broken() simile a mdbx_txn_break().
- Nelle utility mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load, mdbx_stat è stata implementata la registrazione degli errori, degli avvisi e dei messaggi importanti da libmdbx.
- Modifica del comportamento:
- Attivando il profiling del garbage collector (compilazione con l'opzione MDBX_ENABLE_PROFGC=ON) ora vengono conteggiati i costi di tempo CPU per la fusione delle liste di pagine, cioè per il funzionamento della funzione pnl_merge().
- Nello strumento di test, il valore della modalità dati è stato rinominato da data.dups a data.multi.
- È stato migliorato il controllo della lunghezza della chiave all'interno di cursor_seek().
- Se, tramite mdbx_env_set_option(MDBX_opt_txn_dp_limit), l'utente non ha impostato un valore specifico, viene eseguita un'adattamento del dirty-pages-limit all'avvio di ogni transazione di scrittura non nidificata, in base alla quantità di RAM disponibile e alle dimensioni del database.
- In modalità MDBX_NOSTICKYTHREADS è consentito il commit/abort delle transazioni nidificate da qualsiasi thread/flusso.
- Quando si tenta di avviare transazioni nidificate in modalità MDBX_WRITEMAP, viene registrato un errore e restituita l'errore MDBX_INCOMPATIBLE.
- Nell'API C++ nei costruttori/inizializzatori e nei metodi correlati alla formazione della geometria del database, vengono utilizzati per impostazione predefinita solo valori di default.
- All'interno di mdbx_env_set_geometry() sono state migliorate le euristiche per la selezione dei parametri della geometria del database richiesti dall'utente come 'default'.
- Correzioni:
- È stato risolto il problema della mancata sblocco del mutex quando si tenta di chiudere nuovamente il descrittore dbi, inclusa la chiusura esplicita del descrittore dopo l'eliminazione della tabella a esso associata.
- È stato risolto un regressione dello stato del cursore nidificato/dupsort dopo l'inserimento dei dati in modalità MDBX_APPEND.
- Supporto per la ricezione di boot_id durante il lavoro all'interno di un contenitore LXC.
- È stato risolto l'errore nel trattamento non corretto del tentativo di avvio di una transazione di lettura annidata. Ora in queste situazioni viene restituito l'errore MDBX_EINVAL, poiché l'annidamento è supportato solo per transazioni di lettura-scrittura.
- È stato risolto il regressore SIGSEGV relativo all'accesso a un indirizzo nullo quando si lavora in modalità sola lettura senza utilizzare un file LCK, ad esempio quando il database è collocato su un supporto accessibile solo in lettura.
Fonte: opennet.ru
