Podążałem za dyskusją na temat "błędu" na EXT4, który powoduje wyzerowanie plików w razie awarii, jeśli używa się "Utwórz plik tymczasowy, napisz tymczasowy plik, zmień nazwę tymczasowego pliku docelowego". POSIX mówi, że jeśli fsync() nie zostanie wywołana, nie możesz mieć pewności, że dane zostały spłukane na dysk twardy.Bezpieczny i skuteczny sposób modyfikacji wielu plików w systemach POSIX?
Oczywiście robi:
0) get the file contents (read it or make it somehow)
1) open original file and truncate it
2) write new contents
3) close file
nie jest dobra nawet z fsync(), jak komputer może się wysypać podczas 2) lub fsync() i kończy się z części pisemnej pliku.
Zwykle uważano, że jest to dość bezpieczne:
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) close temp file
4) rename temp file to original file
Niestety tak nie jest. Żeby było bezpiecznie na EXT4 będzie trzeba zrobić:
0) get the file contents (read it or make it somehow)
1) open temp file
2) write contents to temp file
3) fsync()
4) close temp file
5) rename temp file to original file
Byłoby to bezpieczne i na katastrofy powinien albo masz nowe zawartość pliku czy stary, nigdy wyzerowany zawartości lub częściowych zawartość. Ale jeśli aplikacja używa wielu plików, fsync() po każdym zapisie będzie wolny.
Moje pytanie brzmi: jak skutecznie zmodyfikować wiele plików w systemie, gdzie fsync() jest wymagany, aby mieć pewność, że zmiany zostały zapisane na dysku? I naprawdę chodzi mi o modyfikowanie wielu plików, tak jak w tysiącach plików. Modyfikowanie dwóch plików i robienie fsync() po każdym nie byłoby zbyt złe, ale fsync() spowalnia działanie podczas modyfikowania wielu plików.
EDYCJA: zmieniono plik fsync() close temp na kolejność corrent, dodano nacisk na pisanie wielu wielu plików.
Przy pomocy metody zmiany nazwy można było napisać 100 000 plików konfiguracyjnych bez fsync(), a wykonanie 100 000 fsync() byłoby wolne. – Raynet
"chcesz, aby dane zapisywane na dysku przez zamknięcie() w każdym razie" O czym ty mówisz? Close ma tylko zwolnić opis pliku zgodnie z POSIX. Nie ma wymogu płukania buforów. http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html – ArekBulski