Работает ли fsync(fd) с файлом, созданным внешней программой?
У меня есть жесткий диск SATA с отключенным кэшем записи:
hdparm -W0 /dev/foo
Я работаю на ext4
раздел с этими параметрами монтирования (среди прочих):
data=ordered
auto_da_alloc
Версия ядра Linux 2.6.32-5-686
,
Теперь у меня есть внешняя программа, которую я не могу изменить, но я знаю, что создает файл следующим образом:
int fd = open(path);
write(fd, data, data_size);
close(fd);
Т.е. это не fsync перед закрытием. Поэтому на данный момент данные, вероятно, находятся в оперативной памяти, где-то в кешах ядра / fs.
Примечание: метаданные пока не имеют значения: окончательные метаданные будут записаны и синхронизированы после того, как я убедился, что данные дошли до дисков. Данные сами по себе являются проблемой.
Итак, вопрос в том, как я могу помочь данным достичь фактических дисковых пластин?
Я думал о запуске этой отдельной программы впоследствии:
int fd = open(path);
fsync(fd);
close(fd);
Поможет ли это сбросить данные или я должен использовать другой подход?
2 ответа
Поможет ли это сбросить данные,
Да, не имеет значения, кто выполняет fsync.
Обратите внимание, что вы, вероятно, хотите синхронизировать каталог, в котором находится файл, для синхронизации метаданных файла.
От man fsync
:
Calling fsync() does not necessarily ensure that the entry in the
directory containing the file has also reached disk. For that an
explicit fsync() on a file descriptor for the directory is also
needed.