howto force refresh NFS-cache beim Einchecken neu erstellte Datei?
Wenn eine Datei erstellt, die auf einem Linux freigegebenen NFS-mount, der client ist entweder Linux o r mac-Maschinen. Die Existenz oder das fehlen einer Datei ist der Schlüssel für das, was als Nächstes zu tun, aber die Kontrolle ist nicht immer das richtige Ergebnis:
e.g ich Tue dies in perl, das noch nicht gut funktioniert, esp mit mac-Maschinen
write_key_file(); # write a file that must be checked before proceeding
Folgende Prüfungen können nicht immer true zurück wenn die Datei existiert
Problem - mit diesem Befehl in perl nicht zurück richtigen status in NFS-system:
if( -e $file){}
Überhören Lösung, die nicht funktioniert:
sleep(5); # wait 5 seconds
system("ls -ltr"); # force to cache?
if(-e $file){}
Ich nicht wollen, um jede Datei prüfen, wie diese, aber es gibt ein paar wichtige Orte, wo es wichtig ist, um die richtige Datei status.
Haben wir bessere Möglichkeiten, um Kraft regenerieren nfs-cache auf eine bestimmte Datei auf einem bestimmten Verzeichnis? Danke.
Ich bin nicht sicher, dass dies ein XY-problem, aber es gibt ein paar schwächsten Punkte, die alle Lösungen.
Ein-NFS-clients Einstellung
Wenn es eine Lösung in dieser Phase, es würde großartig werden!
B -- exit_code-oder return-code von Funktion schreiben
$exit_code = write_key_file();
Das problem dabei, nicht alle schreiben werden, in den Anwendungsbereich des code-block. dies nur ein Teil des Problems gelöst.
C -- Disable NFS-cache für die Datei oder das Verzeichnis für die Datei überprüfen
Ich brauche zu machen sicher ist das möglich und wie? wenn Nein und warum?
und ich bin offen für alle möglichen Lösungen, keine Lösung oder andere Möglichkeiten.
- Dies ist eine hässliche Sache zu tun. Was sind Sie eigentlich versucht zu erreichen? Es ist wahrscheinlich, es gibt einen viel besseren Weg. NFS-caches von design für Effizienz. Nicht-Cache-Dateisystem IO kann getan werden, aber es ist viel langsamer, als Sie sich vorstellen können. In der Regel ist die Antwort: - versuchen Sie es anders.
- Ich bin nicht auf der Suche nach Möglichkeiten, um zu deaktivieren NFS-cache oder Zwischenspeichern für alle Dateien, nur für ein paar wichtige Dateien in das Programm, für das die bestimmte Datei in einem bestimmten Verzeichnis. Ich kann mir nicht denken, alternative Möglichkeiten, dies zu erreichen. Ich kann nur so viel für den Ruf habe ich so weit. vielen Dank für Ihre Aufmerksamkeit
- Hier ist ein einfacher Ansatz.
- Mein Punkt ist, dies kann ein XY-problem. Etwas, das am besten gelöst werden kann durch die Einnahme von s einen Schritt zurück und schauen, was Sie versuchen zu erreichen
- Sie können möglicherweise verwenden Sie
sysopen
mitO_RDWR|O_CREAT|O_EXCL
zu zwingen, NFS-cache aktualisieren - wenn der Aufruf erfolgreich ist, dann wird die Datei gar nicht existiert (aber nicht alle NFS-Implementierungen behandeln O_EXCL richtig). Ich verwendet diese Technik in python (ich bin NULL in perl). Siehe meine Antwort an stackoverflow.com/questions/29979624/... - sind Sie sicher, dass
sysopen
können eine Datei öffnen, die-e $file
nicht vorhanden ist? - ja, Sie versuchen, die Datei zu schreiben wird der NFS-client eine Verbindung mit dem server sofort, während
-e $file
, wird für eine Leseoperation, wird wahrscheinlich mit dem cache. - Ich abgeändert, um python, python-Antwort ist in Ordnung mit mir.
- Vielleicht ist dies ein Versuch Wert: unix.stackexchange.com/a/207383. Er macht einen
opendir/closedir
auf das übergeordnete Verzeichnis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Diese Lösung gehört zu den Kategorie B : exit_code-oder return-code von Funktion schreiben
Folgende Lösungen gehören zu den Kategorie A : NFS-clients Einstellung
also, wenn Sie NICHT erwarten Cache-Datei/Verzeichnis-Einträge werden an den client ausgeliefert, deaktivieren Sie die Zwischenspeicherung.
Setup einen gemeinsamen cache
Verwenden Sie die
sharecache
option zum einrichten des NFS-Einhängungen auf dem client.Diese option legt fest, wie der client die Daten-und cache-Attribut-cache geteilt werden, wenn die Montage die gleichen export mehr als einmal gleichzeitig. Mit dem gleichen cache reduziert den Speicherbedarf auf dem client und präsentiert identische Datei-Inhalt, um Anwendungen, wenn Sie den gleichen remote-Datei zugegriffen wird, über verschiedene mount-Punkte.
Einrichten einer NFS-mount ohne Zwischenspeicherung
Mounten der NFS-Freigabe auf dem client mit der
noac
option.Verwenden
acdirmin=0,acdirmax=0
um die cache-timeouts auf 0 (deaktiviert damit effektiv Zwischenspeichern).Einrichten einer NFS-mount zu ignorieren lookup-caches
(verfügbare Optionen :
all
,positive
undnone
)Beim Zugriff auf einen Verzeichnis-Eintrag über einen NFS-mount,
wenn das angeforderte Verzeichnis-Eintrag auf dem server vorhanden ist, wird das Ergebnis genannt
positive
.wenn das angeforderte Verzeichnis-Eintrag nicht auf dem server vorhanden ist, wird das Ergebnis genannt
negative
.Wenn die
lookupcache
option nicht angegeben ist, oder wennall
angegeben ist, nimmt der client an beide Arten der Verzeichnis-cache Einträge sind gültig bis zu Ihrem übergeordneten Verzeichnisses zwischengespeichert Attribute verfallen.Wenn
pos
oderpositive
angegeben ist, nimmt der client an positiven Einträge sind gültig bis zu Ihrem übergeordneten Verzeichnisses zwischengespeichert Parametern ab, aber immer revalidates negative Einträge, bevor Sie eine Anwendung, die Sie verwenden können.Wenn
none
angegeben ist, wird der client revalidates beide Arten der Verzeichnis-cache Einträge an, bevor Sie eine Anwendung, die Sie verwenden können. Dies ermöglicht eine schnelle Erkennung von Dateien, die erstellt wurden, oder entfernt, die von anderen clients, aber kann Auswirkungen auf Anwendungs-und server-Leistung.Referenzen:
1. Close-To-Open Cache-Konsistenz in der Linux-NFS-Client
2. NFS - Erkennung Remote erstellten Dateien programmgesteuert?
3. NFS-cache : Datei-Inhalte, die nicht aktualisiert auf dem client als auf dem server geändert
4. NFS-man-Seite. Vor allem die "Daten Und Metadaten Kohärenz" Abschnitt.