Udgangen til biblioteket libmdbx 0.13.7 (MDBX) er offentliggjort med implementeringen af en højtydende, kompakt indlejret nøgle-værdi-database. Koden til libmdbx distribueres under Apache 2.0-licensen. Alle relevante operativsystemer og arkitekturer understøttes, samt den russiske Elbrus 2000. Der tilbydes et veludviklet API til C++, samt understøttede bindings til sprog som Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno og Scala. Blandt projekter, der anvender libmdbx, kan nævnes Isar, Erigon og Reth, samt udviklinger fra virksomhederne StarkWare og Positive Technologies.
Historisk set er libmdbx en dybdegående omarbejdning af DBMS LMDB og overgår sin forgænger med hensyn til pålidelighed, funktionaliteter og ydeevne. Sammenlignet med LMDB lægger libmdbx stor vægt på kodekvalitet, stabiliteten af API'et, testning og automatiserede kontroller. Der medfølger et værktøj til at kontrollere databasen's integritet med nogle genoprettelsesmuligheder. Teknologisk set tilbyder libmdbx ACID, streng serialisering af ændringer og ikke-blokerende læsning med lineær skalering på CPU-kerner. Der er støtte til automatisk komprimering, automatisk administration af database størrelse og estimat af forespørgselsvolumen over intervaller (range query estimation).
Vigtige ændringer:
- En kritisk fejl i funktionen mdbx_env_resurrect_after_fork() er blevet rettet ved brug af SysV-semaforer. Fejlen optrådte kun efter at have genereret en datterproces via fork() under en aktiv skrive-transaktion, hvilket førte til forkert funktion af semaforerne og derefter en række forskellige fejl, op til og med ødelæggelse af databasen. Problemet eksisterede fra introduktionen af mdbx_env_resurrect_after_fork() og påvirkede macOS samt POSIX-platforme, når de blev bygget med MDBX_LOCKING=5-optionen.
- Et problem i API'et til databasekopiering, som opstod på ikke-Linux POSIX-systemer (primært macOS), såvel som i nogle tilfælde, når målfilen blev placeret på et ikke-lokalt filsystem, er blevet rettet. Problemet førte til at få fejl EWOULDBLOCK/EAGAIN, som var forårsaget af en fejl/konflikt i låserne fcntl(F_SETLK) og flock() i OS-kernen. Fejlhåndteringen af filblokeringsfanger er blevet redesignet i databasekopierings-API'et på POSIX-systemer.
- En fejl, der førte til en uventet tilbagevenden af MDBX_BAD_DBI ved samtidig opstart af flere transaktioner inden for en enkelt proces efter åbning af databasen, er blevet rettet.
- En fejl, der førte til en uventet tilbagevenden af MDBX_DBS_FULL ved genåbning af allerede åbne tabeller og allerede opnået grænse for åbne DBI-deskriptorer, er blevet rettet.
- En bygningsfejl for Android-platformen er blevet rettet ved eksplicit at definere _FILE_OFFSET_BITS.
- En fejl, hvor ENOMEM blev brugt i stedet for MDBX_ENOMEM, som kunne bryde bygningen på ikke-POSIX/Windows-platforme, afhængigt af konfigurationen og/eller versionen af SDK, er blevet rettet.
- Flere forkerte assert-tjek er blevet rettet eller fjernet, hvilket forårsagede nedbrud af debug-builds i specifikke situationer. Dette gjaldt primært koden i funktionerne txn_end(), txn_lock() og txn_unlock() både på Windows og POSIX.
- Ikke-væsentlige MSVC-advarsler er blevet fjernet. Advarslerne C5286 og C5287 er deaktiveret.
- Logikken for at undgå brug af OFD-låse på POSIX-platforme er blevet forbedret. Udover EINVAL tages der nu også højde for yderligere fejlkoder (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP), hvilket gør det muligt for det samlede bibliotek at fungere i nogle tilfælde, hvor det aktuelle kerne/container/emulator ikke understøtter de nødvendige systemopkald.
- Der er tilføjet støtte til indstillingen "—numa " i testframeworket for at binde den stokastiske test til en NUMA-node. Der er tilføjet en eksplicit fordeling på NUMA-noder i battery/tmux-scriptet, hvilket væsentligt har øget effektiviteten ved testning på NUMA-maskiner.
- I det stokastiske script er der implementeret en tilfældig rækkefølge til at starte individuelle test.
Kilde: opennet.ru
