Perlでチャット(2) ファイルロック処理

ファイルロック(排他処理)手法
・ファイルロック関数を使用(flock式)
シンボリックリンクを使用(symlink式)
ディレクトリを使用(mkdir式)
・ファイルの存在やファイル名を使用(rename式)

シンボリックリンクなんかは明らかにOSに依存してる機能だからあまり使われていないっぽい。flock式も同様。
今回のソースコードはmkdir式なのでこれを勉強。


具体的には
・ロックファイルが存在すれば、statでロックファイルの最終変更時刻を取得する。それが現在時刻-60(つまり60秒前)よりも前なら、ロックファイルを削除する。
・$retry=5
・ロックファイルを作成(755)。失敗時にはsleepを噛ませつつ繰り返し行う。その度に$retryをデクリメントし、retryが0になったらエラーを返す。

という処理を行っているようだ。しかし、http://tech.bayashi.net/pdmemo/filelock.htmlの解説を見ると、これは問題があるらしい。ロックできるかどうかの判断と、実際にロック解除を行うまでにはラグがあり、その間に別プロセスがファイルロックを行おうとすると直後にロックが解除されてしまい、その別プロセスが処理を行えなくなる、というものだそうだ。
解決策は単純に各プロセスのロックをユニークなものにすればよいらしい。
掲示板と違ってチャットは非常にこの問題にデリケートだと思うので、この辺の機構はちゃんと組もうと思う。