Как использовать entry_timeout и attr_timeout в низкоуровневом API FUSE/OSXFUSE?

Есть ли способ безопасно использовать ненулевые тайм-ауты в файловых системах, не предназначенных только для чтения? Кажется, я не могу его найти. Пара контрпримеров:

Пример первый (ненулевое отрицательное время ожидания входа):

  1. Приложение вызывает stat () и получает ENOENT;
  2. вызовы create();
  3. вызывает stat(), ожидая успеха, но вместо этого получает ENOENT из-за отрицательного тайм-аута входа, поэтому он приходит к выводу, что FS сломан / несовместим / и т.д.

Пример два (ненулевое значение attr timeout):

  1. Приложение вызывает utimes();
  2. вызывает stat(), но получает устаревшие значения и приходит к выводу, что FS не работает / не соответствует / и т.д.

Я не могу придумать контрпример для положительного тайм-аута входа - кажется, что даже если lookup () возвращает какой-то устаревший inode, файловая система все равно может вернуть ENOENT для последующего вызова getattr().

Но как насчет 2 приведенных выше примеров?

1 ответ

Решение

Просто для справки, тот же вопрос был опубликован в списке рассылки FUSE.

Вот ответ Кайла Липпинкотта о том, почему работают ненулевые таймауты:

Если create() проходит через ядро, оно делает недействительным время ожидания отрицательного входа. Если создание происходит извне, то тайм-аут все еще остается.

Цитируя Госвина фон Бредерлоу, когда ненулевые таймауты являются проблемой:

Кэширование работает правильно только в том случае, если вы внедрили файловую систему на основе диска, в которой только процесс плавкого предохранителя может изменять метаданные, и весь доступ осуществляется только через плавкий предохранитель. Любая оверлейная файловая система, в которой что-то может изменить основную файловую систему без использования плавкого предохранителя, может привести к несоответствиям.

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

Другие вопросы по тегам