Die Version der Bibliothek libmdbx 0.13.3 (MDBX) wurde veröffentlicht, mit der Umsetzung einer hochleistungsfähigen kompakten eingebetteten Datenbank der Schlüssel-Wert-Klasse. Der Code von libmdbx wird unter der Apache 2.0 Lizenz verteilt. Alle gängigen Betriebssysteme und Architekturen werden unterstützt, einschließlich der russischen Elbrus 2000. Für libmdbx wird eine umfassende API für C++ angeboten, sowie von Enthusiasten unterstützte Bindungen an die Sprachen Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno und Scala.
Historisch gesehen ist libmdbx eine umfassende Überarbeitung der Datenbank LMDB und übertrifft ihren Vorgänger in Bezug auf Zuverlässigkeit, Funktionsumfang und Leistung. Im Vergleich zu LMDB wird in libmdbx erheblicher Wert auf die Codequalität, die stabile API-Arbeit, das Testen und automatische Prüfungen gelegt. Ein Dienstprogramm zur Überprüfung der Integrität der Datenbankstruktur mit einigen Wiederherstellungsfunktionen wird bereitgestellt. Technologisch bietet libmdbx ACID, strenge Serialisierung von Änderungen und nicht blockierendes Lesen mit linearer Skalierung über mehrere CPU-Kerne. Die automatische Kompaktifizierung, automatische Verwaltung der Datenbankgröße und Schätzung des Umfangs von Abfragen nach Bereichen (range query estimation) werden unterstützt.
Hauptänderungen:
- Der Branch 0.13.x hat den Status stabil erhalten. Die Entwicklung des Branches 0.14.x hat begonnen.
- In die C-API wurde die Funktion mdbx_cursor_count_ex() integriert, die sowohl die Anzahl der Multi-Werte für den aktuellen Schlüssel ermittelt als auch Informationen über den eingebetteten Baum bereitstellt, der diese Werte speichert.
- In der C++-API wurde die Methode mdbx::txn::make_broken() hinzugefügt, die mdbx_txn_break() ähnelt.
- In den Dienstprogrammen mdbx_copy, mdbx_drop, mdbx_dump, mdbx_load, mdbx_stat wurde eine Protokollierung von Fehlern, Warnungen und wichtigen Nachrichten von libmdbx implementiert.
- Änderung des Verhaltens:
- Bei aktivierter Profilerstellung des Garbage Collectors (Kompilierung mit der Option MDBX_ENABLE_PROFGC=ON) werden nun die CPU-Zeitkosten für die Zusammenführung von Seitenlisten gezählt, d.h. für die Funktion pnl_merge().
- Im Testdienstprogramm wurde der Wert des Datenmodus von data.dups in data.multi umbenannt.
- Die Kontrolle der Schlüssellänge innerhalb von cursor_seek() wurde überarbeitet.
- Wenn vom Benutzer über mdbx_env_set_option(MDBX_opt_txn_dp_limit) kein eigener Wert angegeben wurde, erfolgt die Anpassung des dirty-pages-limits beim Start jeder nicht geschachtelten schreibenden Transaktion basierend auf dem verfügbaren RAM und der Größe der Datenbank.
- Im Modus MDBX_NOSTICKYTHREADS sind Commits/Abbrüche von geschachtelten Transaktionen aus jedem Thread/Prozess zulässig.
- Beim Versuch, verschachtelte Transaktionen im MDBX_WRITEMAP-Modus zu starten, wird ein Logging durchgeführt und der Fehler MDBX_INCOMPATIBLE zurückgegeben.
- Im C++ API werden in Konstruktoren/Initialisierern und Methoden, die mit der Erstellung der DB-Geometrie verbunden sind, standardmäßig nur die Standardwerte verwendet.
- Innerhalb von mdbx_env_set_geometry() wurden die Heuristiken zur Auswahl der vom Benutzer angeforderten DB-Geometrieparameter "standardmäßig" verbessert.
- Korrekturen:
- Der Rückschritt, dass der Mutex bei einem Versuch, den dbi-Deskriptor erneut zu schließen, nicht entsperrt wurde, wurde behoben, auch nicht, wenn versucht wurde, den Deskriptor nach dem Löschen der zugehörigen Tabelle explizit zu schließen.
- Der Rückschritt des Zustands des verschachtelten/Dupsort-Cursors nach dem Einfügen von Daten im MDBX_APPEND-Modus wurde behoben.
- Unterstützung für den Erhalt von boot_id bei der Arbeit innerhalb eines LXC-Containers.
- Ein Fehler bei der falschen Verarbeitung eines Versuchs, eine verschachtelte Lese-Transaktion zu starten, wurde behoben. In solchen Fällen wird jetzt der Fehler MDBX_EINVAL zurückgegeben, da Verschachtelung nur für Lese-Schreib-Transaktionen unterstützt wird.
- Der SIGSEGV-Rückschritt beim Zugriff auf die Nulladresse im Nur-Lese-Modus ohne Verwendung einer LCK-Datei, z.B. bei der Platzierung der DB auf einem nur lesbaren Medium, wurde behoben.
Quelle: opennet.ru
