rename und verzögerte Allokation
Von: Michael Schuerig (michael@schuerig.de) [Profil]
Datum: 12.03.2009 10:29
Message-ID: <gpakmf$ck2$1@newsreader2.netcologne.de>
Newsgroup: de.comp.os.unix.programming
Datum: 12.03.2009 10:29
Message-ID: <gpakmf$ck2$1@newsreader2.netcologne.de>
Newsgroup: de.comp.os.unix.programming
In einer aktuellen Diskussion[*] über das Verhalten von
(Linux-)Dateisystem hat Theodore Ts'o die folgenden beiden
Aufrufsequenzen genannt, von denen nur die zweite Datenkonsistenz
garantiert.
(A)
open and read file ~/.kde/foo/bar/baz
fd = open("~/.kde/foo/bar/baz.new", O_WRONLY|O_TRUNC|O_CREAT)
write(fd, buf-of-new-contents-of-file, size-of-new-contents-of-file)
close(fd)
rename("~/.kde/foo/bar/baz.new", "~/.kde/foo/bar/baz")
(B)
open and read file ~/.kde/foo/bar/baz
fd = open("~/.kde/foo/bar/baz.new", O_WRONLY|O_TRUNC|O_CREAT)
write(fd, buf-of-new-contents-of-file, size-of-new-contents-of-file)
fsync(fd) --- and check the error return from the fsync
close(fd)
rename("~/.kde/foo/bar/baz.new", "~/.kde/foo/bar/baz")
Eine entscheidende Annahme in beiden Fällen ist, dass das Filesystem
Operationen nicht unmittelbar (synchron) auf der Platte ausführt,
sondern zunächst zwischenspeichert. Böse Dinge passieren, wenn bei (A)
das System nach dem rename abstürzt, bevor die zwischengespeicherten
Blöcke geschrieben wurden. In dieser Situation verweist der Name
~/.kde/foo/bar/baz anschliessend offenbar auf eine leere Datei.
Obwohl sich viele zu diesem Thema geäußert haben, ist mir daraus nicht
vollständig klar geworden, warum genau das Problem entsteht. Erklären
könnte ich mir das beobachtete Verhalten nur dann, wenn rename immer
synchron ausgeführt wird. Dann gibt es einen Zeitraum zwischen dem
Aufruf von rename und dem Schreiben der zwischengespeicherten Daten, in
dem der Dateiname auf eine (noch) nicht existierende Datei (inode?)
verweist. -- Ist das so?
Falls das so ist, wäre dann nicht die saubere Lösung, dass das
Filesystem die Reihenfolge der Operationen garantiert, dass also write
physikalisch ausgeführt wird, bevor rename ausgeführt wird -- oder dass
das beobachtbare Verhalten davon ununterscheidbar ist. Ich nehme an,
dass FS-Operationen dadurch langsamer würden, aber würden sie soviel
langsamer, wie ein erzwungenes fsync auf Anwendungsebene erzwingen
würde?
Michael
[*] https://bugs.edge.launchpad.net/ubuntu/+source/linux/+bug/317781
--
Michael Schuerig
mailto:michael@schuerig.de
http://www.schuerig.de/michael/
[ Auf dieses Posting antworten ]Antworten
- Michael van Elst (12.03.2009 13:44)
- Markus Raab (12.03.2009 15:40)
- Stefan Reuther (12.03.2009 19:24)
