Datei-R / W-Verriegelung und unlink
-
19-09-2019 - |
Frage
Ich habe folgendes Problem. Ich möchte ein Dateisystem basierte Sitzungsspeicher schaffen, wo jeder Session-Daten in einfachen Datei mit Session-IDs genannt gespeichert wird.
Ich möchte folgende API: write(sid,data,timeout)
, read(sid,data,timeout)
, remove(sid)
wo sid == Dateinamen, auch möchte ich eine Art von GC haben, die alle timed-out-Sessions entfernen.
Ganz einfache Aufgabe, wenn Sie mit einzelnem Prozess arbeiten, aber absolut nicht trivial, wenn sie mit mehreren Prozessen oder sogar über NFS arbeiten.
Die einfachste Lösung, die ich daran gedacht war:
write/read:
fd=open(file_name,O_CREAT | O_RDWR); // create a new file or use exsting
fcntl_lock_file(fd)
save data to fd/read data from fd
fcntl_unlock_file(fd)
close(fd)
GC:
fd=open(file_name,O_RDWR);
fcntl_lock_file(fd)
if(timed_out)
unlink(file_name)
fcntl_unlock_file(fd)
close(fd)
Das größte Problem, dass Datei Entkettung Arbeiten auf Dateinamen und Dateisperren auf Datei arbeiten Deskriptoren. So sind die oben nicht funktionieren würde in folgendem Szenario aus:
GC - open,
write - open
GC - lock, unlink, unlock, close // file still exists because held by write
write - lock, write, unlock, close // file removed
Hat jemand eine Idee hat, wie diese Frage gelöst werden kann? Gibt es irgendwelche Tricks, mit denen kombinieren Sperren von Dateien und Entfernen von Dateien oder machen die Bedienung auf Datei Atom?
Weitere Informationen:
- Ich will nicht Datenbank verwenden,
- Ich suche eine Lösung für Unix
- Lösung sollte mit Standard-POSIX-Anrufe wie fcnl, öffnen, schließen arbeiten, unlink
Danke.
clearification Das Hauptproblem ist, dass der Betrieb auf Dateien (Namen - unlink) atomar mit dem Betrieb von Datei-Deskriptoren getan werden soll - Sperren:
- offen, unlink - Arbeiten an Dateien
- fnctl - Arbeit an Deskriptoren
Lösung
Wäre das nicht?
write/read:
fd=open(file_name,O_CREAT | O_RDWR); // create a new file or use exsting
fcntl_lock_file(fd)
if stat(file_name).{st_dev, st_ino} != fstat(fd).{st_dev, st_ino}
unlock, close, retry
save data to fd/read data from fd
fcntl_unlock_file(fd)
close(fd)
Wenn stat
nicht mit EEXIST (Dateiname ist nicht vorhanden) oder zeigt, dass die aktuelle Datei ist nicht das gleiche wie die, die Sie geöffnet, Kaution.