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/> 「恋とハックはアジャイルが命!」