Question

Je le problème suivant. Je veux créer un stockage de session basé sur le système de fichiers où chaque données de session sont stockées dans simple fichier nommé avec ids de session.

Je veux API suivante: write(sid,data,timeout), read(sid,data,timeout), remove(sid) où le nom du fichier sid ==, je veux aussi avoir une sorte de GC qui peuvent enlever toutes les sessions délai d'attente dépassé.

Assez simple tâche si vous travaillez avec le processus unique, mais pas trivial absolutly lorsque vous travaillez avec plusieurs processus ou même sur NFS.

La solution la plus simple que je pensais était:

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)

Le plus gros problème que fichier fonctionne sur les noms de délier des fichiers et des verrous de fichier de travail dans le dossier descripteurs. Donc, ce qui précède ne fonctionnerait pas dans le scénario suivant:

GC - open,
write - open
GC - lock, unlink, unlock, close // file still exists because held by write
write - lock, write, unlock, close // file removed

Est-ce que quelqu'un a une idée de comment cette question peut être résolue? Y a-t-il des astuces qui permettent combiner le verrouillage de fichiers et la suppression ou faire l'opération dans le dossier atomique?

Notes:

  • Je ne veux pas utiliser la base de données,
  • Je cherche une solution pour Unix
  • Solution devrait fonctionner avec des appels standard comme Posix FCNL, ouvrir, fermer, supprimer le lien

Merci.

clearification le problème majeur est que le fonctionnement des fichiers (noms - Délier) doit se faire avec le fonctionnement atomiquement des descripteurs de fichiers - verrouillage:

  • ouvert, unlink - travail sur les fichiers
  • fnctl - travail sur les descripteurs
Était-ce utile?

La solution

Ne serait-ce travail?

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)

Si stat échoue avec EEXIST (nom de fichier n'existe pas) ou indique que le fichier en cours est pas le même que celui que vous avez ouvert, sous caution.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top