Die Veröffentlichung der libmdbx-Bibliothek 0.11.7 (MDBX) mit der Implementierung einer leistungsstarken kompakten eingebetteten Schlüssel-Wert-Datenbank hat stattgefunden. Der Code von libmdbx wird unter der OpenLDAP Public License verbreitet. Alle gängigen Betriebssysteme und Architekturen sowie der russische Elbrus 2000 werden unterstützt.
Die Veröffentlichung ist bemerkenswert durch die Migration des Projekts auf den Dienst GitFlic, nachdem die Administration von GitHub am 15. April 2022 ohne Vorwarnung und ohne Erklärungen libmdbx zusammen mit vielen anderen Projekten gelöscht hat, während gleichzeitig der Zugang für viele Entwickler, die mit unter US-Sanktionen stehenden Unternehmen verbunden sind, gesperrt wurde. Aus Sicht der Benutzer verwandelte sich plötzlich jede Seite, das Repository und die Forks des Projekts in eine "404"-Seite, ohne Möglichkeit zur Kommunikation oder Klärung der Gründe.
Leider sind fast alle Issues verloren gegangen, in denen viele Fragen mit detaillierten Antworten sowie zahlreiche Diskussionen enthalten waren. Der Verlust dieser Informationen stellt den einzigen objektiven Schaden dar, den die Administration von GitHub dem Projekt zufügen konnte. Teilweise bleiben Kopien der Diskussionen im Archiv archive.org zugänglich.
Der Verlust der aufgebauten CI-Skripte und Infrastruktur (die für OpenSource-Projekte kostenlos zur Verfügung steht) hat dazu geführt, dass eine Überprüfung, Vereinheitlichung und Beseitigung von geringem technischen Schuldenstand erforderlich war. Derzeit ist CI fast wieder in vollem Umfang hergestellt, mit Ausnahme von Build- und Testdurchläufen für alle BSD- und Solaris-Varianten. Auffällig ist, dass nach den Maßnahmen von GitHub keine Erklärungen oder Benachrichtigungen eingegangen sind, abgesehen von der Erinnerung an die Zahlungspflicht und dem Versuch, Geld abzubuchen.
Seit der letzten Nachricht zur Veröffentlichung von libmdbx v0.11.3, abgesehen von der Wiederherstellung nach den Maßnahmen von GitHub, sind die folgenden Anpassungen und Korrekturen zu vermerken:
- Ein Umgehungsmechanismus für den entdeckten Effekt/Mangel an Inkohärenz im zusammengefassten Seiten- und Puffercache im Linux-Kernel wurde hinzugefügt. In Systemen, in denen Seiten- und Puffercache tatsächlich zusammengefasst sind, macht es für den Kernel keinen Sinn, Speicher für zwei Kopien von Daten beim Schreiben in eine bereits im Speicher abgebildete Datei zu verschwenden. Daher werden die geschriebenen Daten über die Abbildung im Speicher sichtbar, bevor der Systemaufruf write() abgeschlossen ist, auch wenn die Daten noch nicht auf die Festplatte geschrieben wurden.
Insgesamt ist ein anderes Verhalten unvernünftig, da beim verzögerten Zusammenfügen dennoch Sperren für die Seitenlisten erfasst, Daten kopiert oder PTE korrigiert werden müssen. Daher gilt seit 1989 die inoffizielle Kohärenzregel, als der unified buffer cache in SRV4 eingeführt wurde. Das Erkennen seltsamer Störungen in stark belasteten Szenarien der libmdbx-Nutzung erforderte viel Arbeit. Zuerst wurde das Problem nachgezeichnet, dann Hypothesen verifiziert und Anpassungen überprüft.
Jetzt kann man mit Gewissheit sagen, dass das Problem zuverlässig identifiziert, lokalisiert und sicher behoben wurde, trotz der gesamten Komplexität und Spezifität des Reproduktionsszenarios. Zusätzlich wurde die Arbeitsweise des Umgehungsmechanismus von einem der Entwickler von Erigon (Ethereum) bestätigt; in seinem Fall trat beim Debuggen der Schutz aufgrund einer überflüssigen Assert-Überprüfung als Regression auf.
Es ist anzumerken, dass im Kontext der breiten Anwendung von libmdbx in Arbeitsprojekten die zuverlässige Funktionsweise grundsätzlich wichtiger ist als die Klärung, ob es sich um einen 'Fehler oder ein Feature' handelt und ob man auf eine solche Kohärenz vertrauen kann, insbesondere nicht die Suche nach den Ursachen der Inkoherenz im Linux-Kernel. Daher geht es hier um die Behebung eines Problems, das Nutzer betreffen könnte.
- Der Fehler EXDEV (Cross-device link) wurde behoben, der beim Hot-Copying von Datenbanken ohne Kompaktion auf ein anderes Dateisystem auftrat, sowohl über die API als auch mit dem Tool mdbx_copy.
- Kris Zyp hat die Unterstützung von libmdbx in Deno implementiert. Kai Wetlesen hat das RPM-Paket für Fedora erstellt. David Bouyssié hat Bindings für Scala erstellt.
- Die Verarbeitung des Wertes, der durch die Option MDBX_opt_rp_augment_limit bei der Verarbeitung riesiger Transaktionen in großen Datenbanken festgelegt wurde, wurde korrigiert. Früher konnten aufgrund eines Fehlers überflüssige Aktionen ausgeführt werden, was sich manchmal auf die Leistung in den Implementierungen von Ethereum (Erigon/Akula/Silkworm) und in Projekten von Binance Chain auswirkte.
- Eine Vielzahl von Mängeln wurde behoben, einschließlich im C++ API. Viele Probleme mit dem Build in seltenen und exotischen Konfigurationen wurden behoben. Eine vollständige Liste aller wesentlichen Verbesserungen ist im ChangeLog verfügbar.
- Insgesamt wurden 185 Änderungen in 89 Dateien vorgenommen, etwa 3300 Zeilen hinzugefügt und etwa 4100 Zeilen entfernt. Mehr wurde hauptsächlich aufgrund der Bereinigung unnötiger technologischer Dateien, die mit GitHub und abhängigen Diensten verbunden sind, entfernt.
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 ein großes Augenmerk auf die Codequalität, die stabile API-Arbeit, Tests und automatische Prüfungen gelegt. Es wird ein Tool zur Überprüfung der Integrität der Datenbankstruktur mit einigen Wiederherstellungsmöglichkeiten bereitgestellt.
Technologisch bietet libmdbx ACID, strikte Serialisierung von Änderungen und nicht blockierendes Lesen mit linearer Skalierung über die CPU-Kerne. Es wird eine automatische Kompaktierung unterstützt, sowie die automatische Verwaltung der Datenbankgröße und die Schätzung des Umfangs von Abfragen nach Bereichen (range query estimation). Seit 2016 wird das Projekt von der Firma Positive Technologies finanziert und seit 2017 in ihren Produkten verwendet.
Für libmdbx steht eine umfangreiche C++ API zur Verfügung, sowie von Enthusiasten unterstützte Bindungen an die Sprachen Rust, Haskell, Python, NodeJS, Ruby, Go, Nim, Deno und Scala.
Quelle: opennet.ru
