Frage

Was ist der richtige Weg, um dauerhaft eine Datei in einem Dateisystem POSIX zu umbenennen? fragen, speziell über fsync-Vorgänge auf dem Verzeichnisse . (Wenn dies auf dem O hängt / FS, frage ich über Linux und ext3 / ext4).

Hinweis : es gibt noch andere Fragen auf Stackoverflow über dauerhaft Umbenennungen, aber AFAICT sie es nicht tun Adresse fsync-ing die Verzeichnisse (das ist das, was mir wichtig - ich bin nicht einmal Dateidaten zu modifizieren ).

Im Moment habe ich (in Python):

dstdirfd = open(dstdirpath, O_DIRECTORY|O_RDONLY)
rename(srcdirpath + '/' + filename, dstdirpath + '/' + filename)
fsync(dstdirfd)

Spezifische Fragen :

  • Ist dies auch implizit fsync das Quellverzeichnis? Oder könnte ich mit der Datei zeigt mich in beiden Verzeichnissen nach einem Stromzyklus am Ende (was bedeutete, würde ich auf den harten Linkzähler überprüfen und manuell durchführt Recovery), das heißt, es ist unmöglich, einen dauerhaft Atomverschiebungsvorgang zu gewährleisten?
  • Wenn ich fsync Quellverzeichnis statt das Zielverzeichnis, wird diese auch implizit fsync das Zielverzeichnis?
  • Gibt es zweckdienlichen Test- / Debugging / Lernwerkzeuge (Fehler-Injektoren, Selbstbeobachtung Werkzeuge, mock-Dateisysteme, etc.)?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

POSIX definiert, dass die Umbenennungsfunktion Atom sein muss.

Wenn Sie also (A, B) umbenennen, unter keinen Umständen sollten Sie jemals einen Zustand mit der Datei sowohl in Verzeichnissen oder kein Verzeichnis. Es wird immer genau ein, egal, was Sie mit fsync tun () oder ob das System abstürzt.

Aber das löst nicht das Problem der Herstellung sicher, dass der Umbenennungs () Betrieb haltbar ist. POSIX beantwortet diese Frage :

Wenn _POSIX_SYNCHRONIZED_IO definiert ist, die FSYNC () Funktion zwingen soll alle derzeit die Warteschlange I / O-Operationen mit der Datei verknüpft, die durch Dateideskriptor fildes zu dem synchronisierten E / A-Beendigungszustand. Alle I / O-Operationen sind für synchronisierte E / A-Dateiintegrität Abschluss als definiert sind, abgeschlossen werden.

Wenn Sie also fsync () ein Verzeichnis, bis Umbenennungsoperationen durch die Zeit, auf der Festplatte diese Erträge übertragen werden müssen. fsync () von jedem Verzeichnis sollte ausreichend sein, weil die Unteilbarkeit der Umbenennungs () Operation erfordern würde, dass beide Änderungen Verzeichnisse atomar synchronisiert werden.

Schließlich, im Gegensatz zu der Behauptung in der Blog-Post in einer anderen Antwort erwähnt, die Gründe hierfür erläutern die folgende:

Die fsync () Funktion sollte eine physische Schreiben von Daten aus dem Puffer-Cache erzwingen, und um sicherzustellen, dass nach einem Systemabsturz oder einem anderen Ausfall, dass alle Daten bis zum Zeitpunkt des fsync () -Aufruf auf dem aufgezeichnet werden Scheibe. Da die Begriffe „Cache-Puffer“, „Systemabsturz“, „physikalischen Schreib“ und „nichtflüchtigen Speicher“ sind hier nicht definiert ist, hat die Formulierung mehr abstrakt.

Ein System, das POSIX beansprucht konform und hielt es für ein korrektes Verhalten (dh nicht um einen Fehler oder Hardware-Fehler) in Anspruch nehmen einen fsync () und nicht fortbestehen, diese Änderungen in einem Systemabsturz sein müsste absichtlich falsche Darstellung selbst in Bezug auf sein die spec.

(aktualisiert mit zusätzlichen Informationen re: Linux-spezifisch gegen portable Verhalten)

Andere Tipps

Leider Antwort Dave ist falsch.

Nicht alle POSIX-Systeme könnten sogar eine dauerhafte Lagerung haben. Und wenn sie es tun, ist es immer noch „erlaubt“ wird nach einem Systemabsturz abgespritzt. Für diese Systeme ein no-op fsync () macht Sinn, und so fsync () wird ausdrücklich unter POSIX erlaubt. Es ist auch legal für die Datei in dem alten Verzeichnis, das neue Verzeichnis, beide oder jeden anderen Ort einbringlich. POSIX übernimmt keine Garantie für Systemabstürze oder Dateisystemwiederherstellungen.

Die eigentliche Frage sollte sein:

Wie eine dauerhafte Umbenennungs auf Systeme zu tun, die Unterstützung, die durch den POSIX-API?

Sie benötigen einen fsync () auf, beides zu tun, Quelle und Zielverzeichnis, weil das Minimum derjenigediejenigedasjenige fsync () s werden tun soll bestehen bleiben, wie Quell- oder Zielverzeichnis aussehen soll.

Ist eine fsync (destdirfd) auch implizit fsync Quellverzeichnis?

  • POSIX im Allgemeinen: nein, bedeutet nichts, dass
  • ext3 / 4: Ich bin nicht sicher, ob beide Änderungen an Quell- und Ziel dir in derselben Transaktion in der Zeitschrift enden. Wenn sie das tun, bekommen sie beide zusammen begangen.

Oder könnte ich mit der Datei in beiden Verzeichnissen nach einem Stromzyklus zeigt mich am Ende ( „Crash“), das heißt, es ist unmöglich, einen dauerhaft Atomverschiebungsvorgang zu gewährleisten?

  • POSIX im Allgemeinen: keine Garantien, aber du bist zu fsync soll () beide Verzeichnisse, die nicht auf atomarer dauerhaft sein könnte
  • ext3 / 4: wie viel fsync () Sie minimal Notwendigkeit, auf die abhängig Mount-Optionen. Z.B. wenn angebracht mit „Dirsync-“ Sie brauchen keine der beiden letztgenannten fsync () s. Allenfalls müssen Sie sowohl fsync () s, aber ich bin mir fast sicher, dass man genug ist (Atom dauerhaft dann).

Wenn ich fsync das Quellverzeichnis anstelle des Zielverzeichnisses, wird diese auch implizit fsync das Zielverzeichnis?

  • POSIX: no
  • ext3 / 4: Ich glaube wirklich, beide Ende in der gleichen Transaktion, so dass es keine Rolle, welche von ihnen Sie fsync ()
  • älteren Kernel ext3: (wenn sie nicht in derselben Transaktion sind) einige nicht so optimale Umsetzung hat viel zu viel Syncing auf fsync (), ich wette, es hat jede Transaktion verpflichten, die vor kam. Und ja, eine normale Implementierung würde zuerst mit dem Ziel verknüpfen und entfernen Sie sie dann von der Quelle. So ist die fsync (srcdirfd) würde die fsync auslösen () des Ziels als auch.
  • ext4 / latest ext3: wenn sie nicht in derselben Transaktion sind, können Sie vollständig in der Lage sein sync sie unabhängig (so beides)

Gibt es zweckdienlichen Test / Debugging / Lernwerkzeuge (Fehler-Injektoren, Selbstbeobachtung Werkzeuge, mock-Dateisysteme, etc.)?

Für einen echten Crash, nein. By the way, geht ein echter Crash jenseits der Sicht des Kernels. Die Hardware kann nachbestellen schreibt (und nicht zu schreiben alles), das Dateisystem korrumpiert. Ext4 ist besser gegen diese vorbereitet, weil es Schreib barries ermöglicht (Mount-Optionen) standardmäßig (ext3 nicht) und kann Korruption mit Journal Prüfsummen (auch eine Mount-Option) erkennen.

Und für das Lernen: herauszufinden, ob beide Änderungen irgendwie in der Zeitschrift verbunden sind! :-P

Die Antwort auf Ihre Frage wird viel von der spezifischen Betriebssystem ab, das verwendet wird, wobei die Art der Dateisystem verwendet und ob die Quelle und dest sind auf dem gleichen Gerät oder nicht.

ich durch das Lesen der Umbenennungs (2) man-Seite auf der Plattform starten würden Sie verwenden.

Es klingt für mich wie Sie versuchen, den Job des Dateisystems zu tun. Wenn Sie eine Datei verschieben die Kernel und Dateisystem sind verantwortlich für die Atom-Betrieb und fehler Erholung, nicht der Code.

Wie auch immer, scheint dieser Artikel Ihre Fragen zu fsync Adresse: http://blogs.gnome.org/ alexl / 2009/03/16 / ext4-vs-fsync-my-nehmen /

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top