Как использовать entry_timeout и attr_timeout в низкоуровневом API FUSE/OSXFUSE?
Есть ли способ безопасно использовать ненулевые тайм-ауты в файловых системах, не предназначенных только для чтения? Кажется, я не могу его найти. Пара контрпримеров:
Пример первый (ненулевое отрицательное время ожидания входа):
- Приложение вызывает stat () и получает ENOENT;
- вызовы create();
- вызывает stat(), ожидая успеха, но вместо этого получает ENOENT из-за отрицательного тайм-аута входа, поэтому он приходит к выводу, что FS сломан / несовместим / и т.д.
Пример два (ненулевое значение attr timeout):
- Приложение вызывает utimes();
- вызывает stat(), но получает устаревшие значения и приходит к выводу, что FS не работает / не соответствует / и т.д.
Я не могу придумать контрпример для положительного тайм-аута входа - кажется, что даже если lookup () возвращает какой-то устаревший inode, файловая система все равно может вернуть ENOENT для последующего вызова getattr().
Но как насчет 2 приведенных выше примеров?
1 ответ
Просто для справки, тот же вопрос был опубликован в списке рассылки FUSE.
Вот ответ Кайла Липпинкотта о том, почему работают ненулевые таймауты:
Если create() проходит через ядро, оно делает недействительным время ожидания отрицательного входа. Если создание происходит извне, то тайм-аут все еще остается.
Цитируя Госвина фон Бредерлоу, когда ненулевые таймауты являются проблемой:
Кэширование работает правильно только в том случае, если вы внедрили файловую систему на основе диска, в которой только процесс плавкого предохранителя может изменять метаданные, и весь доступ осуществляется только через плавкий предохранитель. Любая оверлейная файловая система, в которой что-то может изменить основную файловую систему без использования плавкого предохранителя, может привести к несоответствиям.
Например, если вы строите сетевую файловую систему, которая позволяет нескольким хостам изменять данные, у вас могут возникнуть проблемы с ненулевыми тайм-аутами.