NFS клиент, ZFS Server ZoL: cat для измененного файла заканчивается не найденным
Мы попали в беду после обновления от наших клиентов с Ubuntu 12.04 до Ubuntu 14.04.
Поведение:
На клиентском A I измените существующий файл foo на общей папке nfs. На клиенте B I делай кошачьи фу.
1-й раз после монтажа работает. кошка показывает содержание фу. Но если я снова изменю foo на клиенте A и сделаю cat на B I, то получу ошибку: cat: foo: Нет такого файла или каталога
Делать ls
на B решает проблему и cat foo
снова работает, показывая новый контент. Но если я снова поменяю foo на клиенте A, кошка на клиенте B не будет работать.
Анализ:
Если программа на B сначала выполняет системный вызов stat, все работает. Но если программа наподобие cat напрямую использует системный вызов open, она не найдет файл!
С tcpdump и wireshark я вижу, что Ubuntu 12.04 вызывает в пакете NFS в "PUTFH", используя правильный (обновленный) файловый дескриптор, но в 14.04 файловый дескриптор неверен (равен старому файловому дескриптору. До изменения в системе A).
Теперь очень интересная часть: если мой общий ресурс nfs на сайте сервера находится в файловой системе ext4, и я делю его через /etc/exports, сервер nfs отвечает с кодом ошибки NFS4ERR_STALE. Клиент (B) сделает второй запрос с правильным дескриптором файла, и все работает отлично. Даже на 14.04.
Если мой общий ресурс nfs на сайте сервера находится в файловой системе ZFS (ZoL 0.6.4.1, CentOS 7 и Ubuntu 14.04), и я делю его через опцию sharefs или /etx/exports, сервер nfs отвечает с кодом ошибки NFS4ERR_NOENT. Клиент потерпит неудачу.
Вопросы: 1. Как я могу заставить новых клиентов (14.04+) корректно обновлять дескриптор файла, как 12.04 2. (Как вариант) Как я могу заставить сервер отвечать с NFS4ERR_STALE в файловой системе ZFS? Или как должен выглядеть ответ сервера в соответствии со спецификациями?
С уважением Йорг
1 ответ
Исправлено в ZFS на Linux:
https://github.com/zfsonlinux/zfs/pull/3404
получить версию git и скомпилировать ее:
git clone https://github.com/zfsonlinux/zfs.git