Die Bibliothek libmdbx 0.13.7 (MDBX) wurde veröffentlicht und bietet eine leistungsstarke, kompakte, eingebettete Schlüssel-Wert-Datenbank. Der Code von libmdbx steht unter der Apache 2.0 Lizenz. Alle gängigen Betriebssysteme und Architekturen werden unterstützt, einschließlich des russischen Elbrus 2000. Für libmdbx steht eine umfangreiche API für C++ zur Verfügung, sowie von Enthusiasten gepflegte Bindungen für die Sprachen Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno, und Scala. Zu den Projekten, die libmdbx nutzen, zählen Isar, Erigon und Reth, sowie Entwicklungen der Unternehmen StarkWare und Positive Technologies.
Historisch betrachtet ist libmdbx eine umfassende Überarbeitung der LMDB-Datenbank und übertrifft ihren Vorgänger hinsichtlich Zuverlässigkeit, Funktionsumfang und Leistung. Im Vergleich zur LMDB wird in libmdbx großer Wert auf die Codequalität, die Stabilität der API, die Tests und die automatischen Prüfungen gelegt. Es wird ein Tool zur Überprüfung der Integrität der Datenbankstruktur mit einigen Wiederherstellungsfunktionen bereitgestellt. Technologisch bietet libmdbx ACID, strikte Serialisierung der Änderungen und nicht blockierendes Lesen mit linearer Skalierung auf mehreren CPU-Kernen. Auto-Compaction, automatisches Management der Datenbankgröße und die Schätzung von Umfangsabfragen werden unterstützt.
Wesentliche Änderungen:
- Ein kritischer Fehler in der Funktionalität mdbx_env_resurrect_after_fork() bei Verwendung von SysV-Semaphoren wurde behoben. Der Fehler trat nur nach der Erzeugung eines untergeordneten Prozesses mittels fork() während einer schreibenden Transaktion auf, was zu einer fehlerhaften Funktion der Semaphoren und verschiedenen anderen Fehlern, bis hin zur Beschädigung der Datenbank, führte. Das Problem bestand seit der Einführung von mdbx_env_resurrect_after_fork() und betraf macOS sowie POSIX-Plattformen, die mit der Option MDBX_LOCKING=5 kompiliert wurden.
- Ein Problem im API für das Kopieren von Datenbanken wurde behoben, das auf Betriebssystemen außerhalb von Linux POSIX (hauptsächlich auf macOS) auftrat sowie in einigen Fällen, wenn die Zieldatei auf einem nicht lokalen Dateisystem platziert war. Das Problem führte zur Rückgabe des Fehlers EWOULDBLOCK/EAGAIN, verursacht durch einen Fehler/einen Konflikt bei den Sperren fcntl(F_SETLK) und flock() im Betriebssystemkern. Die Fehlerbehandlung für Dateisperren im Kopier-API auf POSIX-Systemen wurde überarbeitet.
- Ein Fehler wurde behoben, der zur unerwarteten Rückgabe von MDBX_BAD_DBI führte, wenn mehrere Transaktionen innerhalb eines Prozesses gleichzeitig nach dem Öffnen der Datenbank gestartet wurden.
- Ein Fehler wurde behoben, der zur unerwarteten Rückgabe von MDBX_DBS_FULL führte, wenn bereits geöffnete Tabellen erneut geöffnet wurden und das Limit der offenen DBI-Deskriptoren erreicht war.
- Ein Fehler beim Erstellen für die Android-Plattform wurde behoben, der auf einer expliziten Definition von _FILE_OFFSET_BITS basierte.
- Ein Fehler in der Verwendung von ENOMEM anstelle von MDBX_ENOMEM wurde behoben. Dies konnte die Erstellung auf nicht-POSIX/Windows-Plattformen beschädigen, abhängig von der Konfiguration und/oder Version des SDK.
- Mehrere fehlerhafte Assert-Überprüfungen wurden korrigiert oder entfernt, die in bestimmten Situationen zu Abstürzen in Debug-Builds führten. Dies betrifft insbesondere den Code der Funktionen txn_end(), txn_lock() und txn_unlock() sowohl unter Windows als auch unter POSIX.
- Wenige unwesentliche MSVC-Warnungen wurden behoben. Die Warnungen C5286 und C5287 wurden deaktiviert.
- Die Logik für das Verwerfen von OFD-Sperren auf POSIX-Plattformen wurde überarbeitet. Jetzt werden zusätzlich zu EINVAL weitere Fehlercodes (ENOSYS, ENOIMPL, ENOTSUP, ENOSUPP, EOPNOTSUPP) berücksichtigt, was es der zusammengebauten Bibliothek ermöglicht, in bestimmten Fällen zu funktionieren, wenn der aktuelle Kernel/Container/Emulator die erforderlichen Systemaufrufe nicht unterstützt.
- Der Testframework hat die Unterstützung für die Option „—numa “ zur Bindung von stochastischen Tests an einen NUMA-Knoten hinzugefügt. Im battery/tmux-Skript wurde eine explizite Verteilung auf NUMA-Knoten hinzugefügt, was die Effizienz beim Testen auf NUMA-Maschinen erheblich gesteigert hat.
- Im stochastischen Skript wurde eine zufällige Reihenfolge für den Start einzelner Tests implementiert.
Quelle: opennet.ru
