「一時ファイルの作成、一時ファイルの書き込み、一時ファイルの名前をターゲットファイルに変更する」プロセスを使用すると、クラッシュ時にファイルがゼロになる原因となる EXT4 の「バグ」に関する議論に従っています。POSIX は、fsync() が呼び出されない限り、データがハードディスクにフラッシュされたことを確認できないと述べています。
明らかにやっている:
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
2) または fsync() 中にコンピューターがクラッシュし、部分的に書き込まれたファイルになってしまうため、fsync() を使用しても適切ではありません。
通常、これはかなり安全であると考えられてきました。
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
残念ながらそうではありません。EXT4 で安全にするには、次のことを行う必要があります。
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
これは安全であり、クラッシュ時には、新しいファイルの内容か、古いゼロ化されていない内容または部分的な内容のいずれかが必要です。しかし、アプリケーションが大量のファイルを使用する場合、書き込みのたびに fsync() が遅くなります。
私の質問は、変更がディスクに保存されたことを確認するために fsync() が必要なシステムで複数のファイルを効率的に変更する方法ですか? つまり、何千ものファイルのように、多くのファイルを変更するということです。2 つのファイルを変更し、それぞれの後に fsync() を実行することはそれほど悪くはありませんが、複数のファイルを変更する場合、fsync() は速度を低下させます。
編集: fsync() クローズ一時ファイルを正しい順序に変更し、多数の多数のファイルを書き込むことに重点を置きました。