Wie kann ich eine Datei, die mit Copy-on-Write geändert wird, am besten lesen?

Wie kann ich eine Datei, die mit Copy-on-Write geändert wird, am besten lesen?

Wir haben eine Datei, die Daten enthält, die immer konsistent sein müssen. Wenn sie geändert werden müssen, Process 1wird eine neue Datei erstellt, die Änderungen in die neue Datei geschrieben und mvdie neue Datei wird mit dem alten Dateinamen umbenannt.

Wenn wir einen anderen Prozess haben, Process 2der diese Datei lesen muss, wie können wir garantieren, dass er immer eine konsistente Datei liest, d. h. dass ein „ mvBy“ Process 1während des Lesens keine Datenbeschädigung verursachen kann?

Antwort1

Sie garantieren dies, indem Sie die neue Datei auf demselben Dateisystem wie die alte Datei erstellen und die rename(2)Funktion [1] verwenden, die garantiert atomar ist.

Auf Unix-Dateisystemen rename(2)wirkt sich a nur auf die Verzeichniseinträge aus; es wirkt sich nicht auf Prozesse aus, die einen offenen Handle zu dem Inode haben, auf den der ursprüngliche Verzeichniseintrag zeigt; dieser Prozess liest bzw. schreibt weiterhin in die alte Datei.

Normalerweise ruft das mv(1)Dienstprogramm einfach auf rename(2), aber es kann auf „Entfernen + Kopieren“ oder andere zweifelhafte nichtatomare Operationen zurückgreifen, falls dies rename(2)fehlschlägt.

Beachten Sie, dass das Vorhandensein von zwei Dateien auf demselben Dateisystem keine Garantie für den rename(2)Erfolg ist. Es gibt Dateisysteme, 9pfsdie eine Umbenennungsoperation nicht unterstützen, sodass sie auf die eine oder andere Weise erstellt werden muss.

[1] oder noch besser, renameat(2)das verhindert, dass die führenden Pfade zu den Dateien heimlich von einem anderen Prozess aus geändert werden, also durch "Symlink-Angriffe".

verwandte Informationen