[Fswiki-dev] Re: ファイルロックに関する処理

Back to archive index

N.Katoh typer_jp****@yahoo*****
2006年 2月 10日 (金) 23:35:46 JST


加藤です。
解決策はおおよそ決まった様ですが、少し別の視点から。

On Fri, 10 Feb 2006 18:22:37 +0900
あき <attin****@kk*****> wrote:

> あきです。
> 
> > 竹添です。
> > 
> > 06/02/10 に あき<attin****@kk*****> さんは書きました:
> > > > やはりダウンロードカウンタでは正確な値が知りたいと思うのと、すでに値が
> > > > 消えるという状況が頻発している状況で更新のみにロックをかけても、ファイル
> > > > が壊れることはないかもしれませんが、かなりの確率で古いデータで上書き
> > > > されてしまうことが目に見えてますよね。
> > >
> > > う〜ん。「かなりの確率で…」というのは問題を過大に見積られている気がしま
> > > す。
> > > 現状のシステムでカウンタが頻繁にクリアされてしまうのは、全添付ファイルの
> > > カウンタが一つのファイルで管理されているからですよね。(添付ファイル毎に
> > > カウンタ管理用のファイルも分けられていれば、衝突が発生する確率は格段に低
> > > く抑えらているはず)
> > > かつ、衝突が発生した場合に、全情報がクリアされてしまうところが問題を大き
> > > くしてしまっている原因です。
> > > 書き込み中ファイルの読み込みを回避できれば、たとえ衝突が起きたとしても
> > > 影響があるのはその対象の添付ファイルのカウンタのみです。かつ、カウンタが
> > > 0になるのではなく、カウントアップしないだけですので、大した問題ではない
> > > と思います。
> > > (現状だと、2人のユーザが、それぞれ異なる添付ファイルを同時にダウンロー
> > > ドしただけで、全ダウンロードカウンタが0にクリアされてしまいますが、別名
> > > 保存→リネームにした場合は、同時にダウンロードされようとした一方の添付
> > > ファイルのダウンロードカウンタだけがインクリメントされないだけとなります)
> > > 決して確率は高くないと思います。
> > 
> > インクリメントされないか、全ての値がクリアされるかという現象の違いは
> > ありますが、現象が発生する確率は同じじゃないですか?
> 
> そうですね。確率的には同じです。
> 違いは被害の大きさでした。

いや、たぶん確率的にはインクリメントされない方が微妙に大きいと思いますよ。
全クリアは書き込みオープンからクローズまでに他プロセスが読み込んだ場合で
すが、インクリメントされないのは読み込みオープンから書き込みクローズまで
の間に他プロセスが読み込んだ場合と、多少衝突範囲が広いですので。まぁ、実
時間ではほぼ同値でしょうから枝葉の話ですが。


さて、今回の全クリアが頻発する問題には間接的な要因として添付画像の存在が
あると思います。添付画像の取得もcgi側から見れば添付ファイルと同様の処理
を行ないますから、添付画像を貼っている場合は格段にこの問題が発生しやすく
なると思います。特に、同一ページに複数の画像があればそれだけ添付画像の取
得=カウンタインクリメントが増え、ブラウザによっては複数セッションを多数
張りますから1人のアクセスだけで発生し得ます。

このことは、ファイルロックなどにより解決できますが、しかし、その場合に気
になるのがレスポンスの悪化です。そこで提案なのですが、環境設定で条件によ
りカウントアップ抑制ができるようにしたらどうでしょうか。

案としては、
画像ファイル(mimeが"image/*のもの)の場合はカウントしない
→欠点:refで張ったデスクトップ壁紙などもカウントされなくなる
AttachHandlerで例えばnocountとかのパラメータが設定されていたらカウントアッ
プしないようにしておき、ref_image、ref_textのリンクにはこれを含める
→欠点:普通にrefを使ってもURLをコピーしてnocount付きにすればカウントされない

まぁ、後者の欠点は気にする必要がないかも知れませんが、回避策があるのはや
だと思う人もいるかも知れませんし、環境設定で双方を選ぶ事ができる様にすれ
ば良いかなと思います。


最後に話はロック機構に戻りますが。

> > sub sync_update_config(ファイル名, 関数リファレンス){
> >   1)ロック
> >   2)ファイルから読み込み
> >   3)読み込んだ値を引数として関数を呼び出し
> >   4)戻り値を一時ファイルに書き込み
> >   5)リネームしてロック解除
> > }
> > 
> > みたいな感じで。
> 
> なるほど、関数のリファレンスを渡すのですね。
> 恐れ入ります。
> 良さそうです。

なるほど、と言う感じです。
私が昨日のメールでちらっと書いたのは、

sub change_config_hash(ファイル名, ハッシュリファレンス){
  1)ロック
  2)ファイルから読み込み
  3)読み込んだ値と引数のハッシュをマージ
  4)書き込み
  5)ロック解除
}

と言うような物を想定してました。
ただ、これだと同じ添付ファイルのカウントアップが衝突するとカウントアップ
されない不具合があるんですよね。竹添さんの方法ならそういう事もないし、
ロック期間もそう変わりませんから良い方法ですね。perlならコールバック関数
も書きやすいですし。

-- 
typer <typer_jp****@yahoo*****> like perl,
  stay FreeBSD  http://freebsd.g.hatena.ne.jp/TransFreeBSD/
  use  fswiki   http://aaa-www.net/~typer/cgi-bin/wiki.cgi/diary
and named Noboru Katoh <typer****@chive*****>



Fswiki-dev メーリングリストの案内
Back to archive index