2010-11-24 7 views
9

私の生産環境では、Storable.pmによって作成された 破損した格納可能なハッシュと思われるものがありました。 Devで動作を再現することができないため、正確に診断することは困難でした。Storable.pm - 切り捨てられていないファイルに保存すると破損する

コードは長い間働いていて、それを変更したのは という破損がハッシュから削除されていました。最近まで、 のハッシュは同じサイズのままだったか、または成長しました。

ファイルがreadwriteで開かれ、store_fdがファイルに書き込みます。 ハッシュが(時には)小さくなっているので、この2000バイトのファイルには、 に1000バイトと書いてあります。末尾の1000バイトは古いゴミデータです。私の テストケースでは、ハッシュを取得すると、 と予想されるため、ガベージデータは無視されます。

open($sf, "+< $self->{mod_state_filename}"); 
flock($sf, LOCK_EX); 
$self->{mod_state} = fd_retrieve($sf); 
delete ($self->{mod_state}{"somekey"}); 
seek($sf, 0, 0); 
store_fd($self->{mod_state}, $sf); 
flock($sf, LOCK_UN) 
close($sf); 

私の質問:

  1. この作品は、万一、またはそれは私がファイルを切り捨てる 不可欠ですか?
  2. 保存されたハッシュでファイル終端文字の何種類かを使用していますか? ?もしそうなら、 それはなんですか?
  3. 上記のコードは、 を削除し、追加して削除して追加すると、 は私のテストケースで完全に動作します。 非切り詰めファイルのため、テストケースシーケンス が失敗する可能性があります。 (私はこの が本当に曖昧な質問であることを知っているので、それを無視して 自由に感じる)。
+2

なぜ、ストア可能な組み込み関数を使用していないのですか? Storableもロックをサポートしていますhttp://search.cpan.org/~ams/Storable-2.24/Storable.pm#ADVISORY_LOCKING – singingfish

+0

私はそれがわかりますが、私はコードを書いていません。私はそれを継承する前に、この方法(削除を除いて)年でした。 私はStorable :: lockingを使用するようにコードを変更することを検討したいと思いますが、問題が解決するかどうかはわかりません。 (私は試してみることができますが、問題は本番にしか現れませんので、修正が必要です。試行錯誤はできません)。 問題がロックされているとは思わない。 – Brock

答えて

1

私はゴミを末尾でどれだけStorable取引分かりませんが、確かにそれは扱うことができるかどうかについてのすべての疑問を解消、store_fdの呼び出し後

truncate $sf, tell($sf); 

を追加するために傷つけることはできませんそれは今も将来もそうです。

+0

ピーター、私をシャーリーと呼んではいけない。私は同意しますが、私は最初にテスト条件でそれを確認したかったので、それは疑問です。 – Brock

0

申し訳ありませんが、私はこれを更新しました。

私はperl5-portersに質問し、質問に答えました。

私はテストでは複製できないので、修正を実装していないので、制作環境にプッシュしたくないので、私の回避策は現時点ではより安全です。

perl5-portersからの回答に基づいて、切り詰めは間違いなく良いアイデアです。

私は、誰かが私の質問に恩恵を抱いていた(またはそうかもしれない)のを知らなかった。