È stata pubblicata la versione della libreria libmdbx 0.13.7 (MDBX) che implementa un database integrato ad alta prestazione di tipo chiave-valore. Il codice di libmdbx è distribuito sotto licenza Apache 2.0. Sono supportati tutti i sistemi operativi e le architetture attuali, inclusi i 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. Tra i progetti che utilizzano libmdbx si possono citare Isar, Erigon e Reth, nonché le soluzioni delle aziende StarkWare e Positive Technologies.
Historicamente, libmdbx è una revisione approfondita del DBMS LMDB e supera il suo predecessore in termini di affidabilità, funzionalità e prestazioni. Rispetto a LMDB, in libmdbx viene posta grande attenzione alla qualità del codice, al funzionamento stabile dell'API, al testing e ai controlli automatici. È fornuto uno strumento per verificare l'integrità della struttura del database con alcune funzionalità di ripristino. Dal punto di vista tecnologico, libmdbx offre ACID, stretta serializzazione delle modifiche e lettura non bloccante con scalabilità lineare su core CPU. Supporta la compattazione automatica, la gestione automatica delle dimensioni del database e la stima del volume delle query per intervallo (range query estimation).
Principali modifiche:
- È stato risolto un errore critico nella funzionalità mdbx_env_resurrect_after_fork() durante l'uso dei semafori SysV. L'errore si manifestava solo dopo la creazione di un processo figlio tramite fork() mentre era in esecuzione una transazione di scrittura, il che portava a un funzionamento errato dei semafori e, conseguentemente, a vari errori, fino a danneggiare il database. Il problema è esistito fin dall'introduzione di mdbx_env_resurrect_after_fork() e ha interessato macOS, così come le piattaforme POSIX compilate con l'opzione MDBX_LOCKING=5.
- È stata risolta una problematica nell'API di copia del database, che si manifestava su sistemi POSIX diversi da Linux (principalmente su macOS), e in alcuni casi quando il file di destinazione si trovava su un file system non locale. Il problema portava al ritorno di un errore EWOULDBLOCK/EAGAIN, causato da un difetto/conflitto nei lock fcntl(F_SETLK) e flock() nel kernel del sistema operativo. È stata riprogettata la gestione degli errori nei lock dei file nell'API di copia sui sistemi POSIX.
- È stato risolto un errore che portava a un ritorno inaspettato di MDBX_BAD_DBI all'avvio simultaneo di più transazioni all'interno di un unico processo dopo l'apertura del database.
- È stato risolto un errore che portava a un ritorno inaspettato di MDBX_DBS_FULL durante la riapertura di tabelle già aperte e al raggiungimento del limite massimo di descrittori DBI aperti.
- È stato corretto un errore di compilazione per la piattaforma Android quando si definiva esplicitamente _FILE_OFFSET_BITS.
- È stato corretto un errore che utilizzava ENOMEM invece di MDBX_ENOMEM, il quale potrebbe compromettere la compilazione su piattaforme non POSIX/Windows, a seconda della configurazione o della versione dell'SDK.
- Sono stati corretti o rimossi diversi assert non corretti, che causavano crash in build di debug in situazioni specifiche. Principalmente nel codice delle funzioni txn_end(), txn_lock() e txn_unlock() sia su Windows che su POSIX.
- Sono stati risolti avvertimenti non significativi di MSVC. Gli avvertimenti C5286 e C5287 sono stati disattivati.
- È stata migliorata la logica di rifiuto dell'uso dei lock OFD sulle piattaforme POSIX. Ora, oltre a EINVAL, vengono considerati codici di errore aggiuntivi (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), il che consentirà alla libreria compilata di funzionare in alcuni casi in cui il kernel/contenitore/emulatore attuale non supporta le chiamate di sistema necessarie.
- Nel framework di test è stata aggiunta la supporto per l'opzione "—numa " per legare il test stocastico al nodo NUMA. Nello script battery/tmux è stata aggiunta una distribuzione esplicita tra i nodi NUMA, il che ha sostanzialmente aumentato l'efficienza durante i test su macchine NUMA.
- Nello script stocastico è stata implementata un'ordine casuale di avvio dei singoli test.
Fonte: opennet.ru
