Сбой приложения и согласованность файловой системы - PullRequest
0 голосов
/ 04 мая 2019

Каковы гарантии согласованности при сбое приложения, но исправной файловой системе, переименования файла?

Существует много литературы о том, как обеспечить сохранение данных после сбоя файловой системы (из-за потери питания и т. Д.), Но я не смог найти много дискуссий о том, что нужно сделать, чтобы гарантировать, что данные выживают после сбоя приложения.

В частности, если у меня есть файл 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.

...