[Hiki-dev:01120] info.db が時々壊れる件について

Back to archive index

Kazuhiko kazuh****@fdiar*****
2006年 8月 5日 (土) 00:26:05 JST


かずひこです。

ここ半年くらい、時々 info.db が壊れたという声を聞きます。私の近くでも何度
か経験があります。完全な原因の究明にいたっていませんが、たぶん
hiki/db/ptstore.rb のキャッシュまわりが原因じゃないかと思われます。

@file_cacheをオープンしながらロックしたり解除したりとか、rewindしなくてい
いのかとか、そのへんがあやしい気はしますが、詳細は不明です。

いずれにしても、info.db への書き込みトランザクション中の問題と思われるの
で、まずは以下の変更(hiki/command.rb, misc/plugin/rank.rb)をしてコミッ
トしました。

・従来は閲覧時に必ずアクセスカウンタを増やしていましたが、その処理を  
  rank.rb プラグインに移動しました。rank.rb プラグインを有効にしない限り、
  アクセスカウンタは増えません(将来的には、referer.rb のように、info.db
  とは別ファイルに書き込むような仕様がいいかなとも思います)。

・従来は閲覧時に毎回、そのページから他のページにリンクをはっている情報を
  info.db に書き込むようになっていましたが、info.db にもともと書いてある
  情報と異なった場合のみ書き込むように変更しました。

そして、ptstore.rb のキャッシュについては、以下のようなシンプルな実装のも
のに書き換えました。

read_only の場合:
  キャッシュがあればそれを dup してから yield

  キャッシュがなければ、ファイルから load して、それをキャッシュに dup し
  てから yield

read_only でない場合:
  ファイルから load して、yield してから更新されたデータをファイルに
  dump するとともに、キャッシュに dup する

また、PStore クラスを継承して、transaction, dump, load, load_file のみオー
バーライドするように変更しました。

command.rb と rank.rb の変更はともかく、ptstore.rb の変更はけっこう熱いと
思いますので、ご注意ください。

お気付きの点などあればお知らせください。
よろしくお願いします。
-- 
かずひこ <http://www.fdiary.net/>
  「恋とハックはアジャイルが命!」



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