Problem:
Schritt 1 Auf Rechner A ändere ich existierende Datei foo, die auf einem NFS-Mount liegt. Schritt 2 Auf Rechner B (über ein NFS-Mount) mach ich
cat foo
Direkt nach dem mount wird dieser Befehl erfolgreich ausgeführt.
Wenn ich nun noch einmal die Datei foo auf Rechner A ändere und auf Rechner B
cat foo
ausführe lese ich:
cat: foo: Datei oder Verzeichnis nicht gefunden
Ein
ls
auf Rechner B führt dazu, dass ich die Datei sehe. Ein
cat foo
zeigt jetzt den Inhalt an. Aber nur solange die Datei nicht auf Rechner A geändert wird!
Analyse:
Mit einem kleinen Programm dass sich zum testen geschrieben haben, zeigte sich, dass wenn man auf die Datei foo zuerst den System call "stat" macht und danach den System call "open" geht alles prima. Wenn man aber direkt die Datei mit "open" öffnet kommt es zu dem Fehler. (Übrigens wenn man statt cat less benutzt geht es sofort, da strace zeigt, dass less zuerst ein "stat" macht.)
Mit tcpdump und Wireshark sieht man, dass Ubuntu 12.04 in dem NFS-traffic beim "PUTFH" direkt das richtige filehandle anfragt aber Ubuntu 14.04 zuerst das falsche und dann im 2. Schritt das richtige. Und es wird noch ein sehr interessantes Detail sichtbar:
Wenn auf dem Server die Freigabe auf dem Dateisystem ZFS liegt, kommt als Fehlercode NFS4ERR_NOENT.
Wenn auf dem Server die Datei auf dem Dateisystem ext4 liegt, kommt der Fehlercode NFS4ERR_STALE, der Client fragt daraufhin mit dem richtigen filehandle nochmal an und es funktioniert. Das scheint noch ein zusätzlicher Fehler auf ZoL-Seite zu sein.
Meine Frage:
Warum fordert Ubuntu 12.04 gleich das richtige filehandle an, 14.04 aber nicht? Ist das ein Bug oder war es zufällig unter 12.04 falsch und ist jetzt richtig?
Umgebung:
Clients Ubuntu 14.04 und 12.04, 64 Bit, NFSv4 (mit Kerberos, Fehler tritt auch ohne Kerberos auf) Server 1x Ubuntu 14.04, 1x CentOS 7, alles 64 Bit, mit ZFS on Linux und NFS Freigabe durch das ZFS hindurch
Rechner A Ubuntu Version egal
Rechner B Ubuntu 14.04 , bei 12.04 tritt das Problem NICHT auf!