Schreibverfahren: kein Datenverlust bei Absturz #19
Notifications
Due Date
No due date set.
Depends on
#22 Was kostet es, Historie spaeter moeglich zu halten?
RDietermann/dionotes-client
Reference: RDietermann/dionotes-client#19
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Part of #16
Question
Wie genau wird eine Notiz auf die Platte geschrieben, sodass ein Absturz sie nicht zerstört?
Ein direkter
fs::writeauf die Zieldatei kürzt sie zuerst und schreibt dann. Bricht der Vorgang mittendrin ab — Stromausfall, Absturz, volle Platte —, ist die Notiz nicht mehr die alte und noch nicht die neue, sondern zerstört. Genau das Szenario, gegen das „deine Notizen sind gewöhnliche Dateien" schützen soll.Zu entscheiden:
rename? Wo liegt die temporäre Datei — neben der Notiz oder im Systemtemp? (Einrenameüber Laufwerksgrenzen hinweg ist kein atomarer Vorgang.)sync_allvor dem Umbenennen, oder ist das übertrieben für eine Notiz-App?Zielgröße: die Schreibfunktion in Pseudocode, plus die Antwort, was nach einem Absturz auf der Platte liegt.
Nachtrag nach #22. Die Recherche entkräftet den Einwand aus der Beratungsrunde und liefert dabei belegte Fakten, die dieses Ticket direkt betreffen.
1. Historie stellt genau eine Anforderung: eine einzige Schreibstelle. „Temporäre Datei, dann umbenennen" schließt Historie nicht aus, sondern macht sie erst billig — die Vorfassung liegt zum Zeitpunkt des Umbenennens noch unversehrt da. Teuer wird es nur, wenn nach einem halben Jahr fünf Stellen im Code Notizen schreiben. Das kostet heute nichts, weil es noch keine Schreibstelle gibt.
2. Microsoft empfiehlt für genau diesen Fall
ReplaceFile, nichtMoveFileEx. Aus der TxF-Deprecation-Doku, Abschnitt „Applications updating a single file with document-like data".3. Temp+rename verliert Metadaten — und das ist belegt, nicht vermutet: Die
ReplaceFileW-Remarks führen als Vorteil auf, dass die Funktion Erstellungszeit, DACLs, Verschlüsselung, Komprimierung und benannte Streams erhält, was per Kontrast zeigt, dass ein nacktes Umbenennen sie verliert. Die File ID ändert sich sogar beiReplaceFile. Kein untersuchtes Rust-Crate (tempfile,atomicwrites,atomic-write-file) benutztReplaceFile.→ Folge, die hier zu entscheiden ist: Ein „erstellt am" gehört damit ins Frontmatter der
.md, nicht ins Dateisystem. Das berührt auch #23 (Anlegen).4. Das realistischste Fehlerbild ist
ERROR_SHARING_VIOLATION, wenn Defender oder ein Sync-Client die Zieldatei ohneFILE_SHARE_DELETEoffen hält.tempfile::NamedTempFile::persistgibt die temporäre Datei imPersistErrorzurück — gebaut genau für den Wiederholungsfall. Ebenfalls belegt:persistsynchronisiert weder Inhalt noch Verzeichnis, diesync_all-Frage bleibt also eine eigene.5. Die temporäre Datei muss im selben Verzeichnis liegen —
fs::renamescheitert über Volume-Grenzen. Damit ist die Frage im Ticket beantwortet: nicht ins Systemtemp. Offen bleibt, wie sie aus dem Baum ferngehalten wird, ohne die Punkt-Regel aufzuweichen.