0

次の問題があります。各セッションデータがセッションIDで名前が付けられた単純なファイルに保存されるファイルシステムベースのセッションストレージを作成したいと思います。

次のAPIが必要です:write(sid,data,timeout)、、ここread(sid,data,timeout)remove(sid) sid ==ファイル名、また、すべてのタイムアウトセッションを削除する可能性のあるある種のGCが必要です。

単一のプロセスで作業する場合は非常に単純なタスクですが、複数のプロセスで作業する場合、またはNFSを介して作業する場合でも、絶対に簡単ではありません。

私が考えた最も簡単な解決策は次のとおりです。

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)

ファイルのリンク解除がファイル名で機能し、ファイルロックがファイル記述子で機能するという最大の問題。したがって、上記は次のシナリオでは機能しません。

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

誰かがそのような問題がどのように解決されるかについての考えを持っていますか?ファイルロックとファイル削除を組み合わせたり、ファイルをアトミックに操作したりできるトリックはありますか?

ノート:

  • データベースを使いたくない、
  • Unixの解決策を探しています
  • ソリューションは、fcnl、open、close、unlinkなどの標準のPOSIX呼び出しで機能する必要があります

ありがとう。

明確化の主な問題は、ファイルの操作(names --unlink)は、ファイル記述子の操作--lockingを使用してアトミックに実行する必要があることです。

  • 開いてリンクを解除します-ファイルを操作します
  • fnctl--記述子を処理します
4

1 に答える 1

1

これはうまくいきませんか?

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)

EEXISTで失敗した場合stat(ファイル名が存在しない場合)、または現在のファイルが開いたファイルと同じでないことを示している場合は、ベイルします。

于 2009-12-15T22:03:51.617 に答える