9

私の実稼働環境では、Storable.pm によって作成された、破損した保存可能なハッシュと思われるものがありました。Dev で動作を再現することができないため、正確な診断が難しくなっています。

コードは長い間機能しており、壊れた変更はハッシュからの削除でした。最近まで、ハッシュは同じサイズのままか、または大きくなりました。

ファイルは 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. 上記のコード、削除と追加、および削除と追加は、私のテストケースで完全に機能します。切り捨てられていないファイルが原因で失敗する可能性のあるテスト ケース シーケンスを提案できますか? (これは非常に漠然とした質問であることはわかっているので、無視してかまいません)。
4

2 に答える 2

1

末尾のゴミをどれだけうまく処理できるかはわかりませんがStorable、追加しても問題ないことは確かです

truncate $sf, tell($sf);

への呼び出しの後、store_fd現在および将来に対処できるかどうかについての疑いをすべて解消します。

于 2010-12-03T00:21:56.330 に答える
0

申し訳ありませんが、これを更新したと思っていました。

perl5-porters に質問したところ、回答が得られました。

テスト中にレプリケートできないため、修正を実装していないため、本番環境にプッシュしたくないため、現時点では回避策の方が安全です。

perl5-porters からの回答に基づいて、切り捨ては間違いなく良い考えです。

誰かが私の質問に報奨金を出した (またはできる!) とは知りませんでした。

于 2010-12-03T04:18:54.313 に答える