私の実稼働環境では、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);
私の質問:
- これは機能するはずですか、それともファイルを切り捨てることが不可欠ですか?
- 保存されたハッシュは、ある種のファイル ターミネータ文字を使用していますか? もしそうなら、それは何ですか?
- 上記のコード、削除と追加、および削除と追加は、私のテストケースで完全に機能します。切り捨てられていないファイルが原因で失敗する可能性のあるテスト ケース シーケンスを提案できますか? (これは非常に漠然とした質問であることはわかっているので、無視してかまいません)。