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
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top