BBSスクリプトを改造(求む☆アドバイス)  #5950
投稿者:  やちまう (2000/01/22 05:48)

記事消失防止のために、私が現在思いつくことを全て盛り込みました。

・・・と言っても、「えせプログラマ」の私のことですから、どこかにまだ
弱点があるかもしれません。

一応、我が家のLinuxマシンとFreeBSDマシンで、過負荷(1分間に1000アクセス)
の実験をしてOK(ログ消失なし)でしたので大丈夫だと信じたいのですが・・・

※一応、記事消失防止の為にとった手段を記述しておきます。
 この記事を読んで下さった方で、もしお気付きの点がございましたら
 ご教示ください。(プログラマの人もきっといらっしゃいますよね?)

----------------------------------------------------------------------

   今まではflock関数のみを用いて排他制御をかけていましたが・・・。

   open(LOG, "+< logfile");
   flock(LOG,2);
     :
     :

   ログファイルopenの際はまず、ロックファイル(空のファイル)を作成、
   これをファイルopen(アクセス中)のシグナルにする。【第1ロック】

      この時点で他からアクセスがあった場合は、ロックファイルの存在
      を確認、ロックファイルが存在したらタイムスタンプをチェックし、
      5分以上前に作成された物ならロックファイルを削除し、そうでな
      ければ3秒待ってリトライ(3回)。それでも、ロックファイルが
      残っていたら、タイムアウトメッセージを吐き出し、プロセス終了。

   次に、open直後には必ずflock(読1/書2)を実行。【第2ロック】
   しかしながら、DolphinのサーバはNFSなのだ。どこまで信用していいの
   か分からない。flock(1/2)はcloseもしくはプロセス終了でアンロック
   されるのでflock(8)は行わない。(行うと却ってアダになる可能性が)

   書き込み作業の際はログファイルに直接書き込まずに、プロセス番号を
   ($$で取得)ファイルネームとするテンポラリファイルを作成してそこ
   に書き込む。これなら書き込まれるファイルが毎回異なった名前を持つ
   ため、ここでプロセスが異常終了しても破壊されるのはテンポラリファ
   イルのみのハズ。

   続いて生成したテンポラリファイルのファイルサイズをチェックし、もし
   ファイルサイズがゼロならば「異常終了」メッセージを吐き、テンポラリ
   ファイルを削除してプロセスを終了。ファイルサイズがゼロでなければテ
   ンポラリファイルをログファイル名にリネーム(ログファイルに上書き)
   してプロセスを終了する。

   ファイルcloseした時点で【第2ロック】は解除されているので、最後に
   ロックファイルを削除(【第1ロック】を解除)する。

(以上)

--
やちまう(やまっち)
ymch@din.or.jp