Каковы гарантии согласованности при сбое приложения, но исправной файловой системе, переименования файла?
Существует много литературы о том, как обеспечить сохранение данных после сбоя файловой системы (из-за потери питания и т. Д.), Но я не смог найти много дискуссий о том, что нужно сделать, чтобы гарантировать, что данные выживают после сбоя приложения.
В частности, если у меня есть файл foo.txt
с начальным содержанием foo...
(длина> 4 КБ) и запустите
FILE* f = fopen("foo.txt.tmp", "w");
char buf[] = "bar..."; // sizeof(buf) > 4k
fwrite(buf, sizeof(char), sizeof(buf), f);
fclose(f);
rename("foo.txt.tmp", "foo.txt")
Гарантируется ли, что любое приложение, читающее foo.txt
, пока файловая система исправна, увидит только foo...
или bar...
? Или отсутствие fsync(f)
до fclose)
будет означать, что отдельное приложение может видеть какое-то промежуточное состояние?
Я провел фазз-тест с одним потоком записи и несколькими параллельными потоками чтения, и этот тест не обнаружил какого-либо частичного состояния, но это не обязательно исключает возможность наблюдения частичного состояния.
Меня больше всего интересует поведение файловой системы ext4 в Linux.