farid hat geschrieben:Was spricht gegen
bsddb3?
Dies:
sma hat geschrieben:Mir geht's darum, zu lernen, wie's geht. Nicht einfach eine vorhandene Implementierung genannt zu bekommen.
lunar hat geschrieben:Wie kann man denn mit "os.open" direkt (also ohne zweite Lock-Datei) sicherstellen, dass man nicht parallel auf eine Datei schreibt?
Mit `os.O_EXLOCK`. Muss aber leider nicht von jedem Betriebssystem und Dateisystem unterstützt werden.
Das Umbenennen atomar ist, reicht leider nicht (zumal trifft das unter Windows erst ab Vista durch eine neue `MoveFileTransacted`-Funktion zu).
Durch einen exklusiven Lock auf der ursprünglichen Datei kann ich andere schreibende Prozesse stoppen. Ich kann währenddessen eine neue Datei schreiben. So weit so gut. Doch nun müssen alte und neue Datei die Plätze tauschen. Um die alte zu löschen, muss ich (wahrscheinlich) den Lock lösen. Nun kann ein anderer Prozess ebenfalls schreiben, während ich noch die neue Datei zurück in die alte umbenennen will. Selbst wenn das geht, habe ich noch ein anderes Problem: Was, wenn mein Prozess abstürzt, nachdem er gelöscht, aber bevor er umbenannt hat?
Mir fällt da nur folgende Variante ein:
Meine Datei enthält am Anfang einen 8-Byte-Index. Hash und Daten hänge ich jetzt immer nur an und überschreibe niemals andere Daten. Will ich lesen, hole ich mir einen nicht exklusiven Lock auf die Datei, lese den Index, springe an diese Position und lese Hash und Daten. Dann gebe ich den Lock wieder frei. Will ich schreiben, hole ich mir einen exklusiven Lock, hänge jetzt Hash und Daten an die Datei an und falls das geklappt hat, schreibe atomar den neuen Index. Optional kann ich mir vorher noch die Dateilänge merken und versuchen, diese wieder auf diesen Wert zu "truncaten".
Es ist wohl schlau, auch den Hash an den Anfang der Datei zu schreiben, in der Hoffnung, dass 28 Bytes immer in einem Block atomar geschrieben werden.
Leider habe ich jetzt noch das Problem, dass meine Datei grenzenlos wächst und ab und zu verkleinert werden müsste...
Zusammenfassend: Windows und NFS sind doof. Der eine hat kein erreichbares atomares Rename, der andere keine Locks.
Vielleicht schaue ich mir später noch mal den Quelltext von BSDDB an.
Stefan