私の生産環境では、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);
私の質問:
- この作品は、万一、またはそれは私がファイルを切り捨てる 不可欠ですか?
- 保存されたハッシュでファイル終端文字の何種類かを使用していますか? ?もしそうなら、 それはなんですか?
- 上記のコードは、 を削除し、追加して削除して追加すると、 は私のテストケースで完全に動作します。 非切り詰めファイルのため、テストケースシーケンス が失敗する可能性があります。 (私はこの が本当に曖昧な質問であることを知っているので、それを無視して 自由に感じる)。
なぜ、ストア可能な組み込み関数を使用していないのですか? Storableもロックをサポートしていますhttp://search.cpan.org/~ams/Storable-2.24/Storable.pm#ADVISORY_LOCKING – singingfish
私はそれがわかりますが、私はコードを書いていません。私はそれを継承する前に、この方法(削除を除いて)年でした。 私はStorable :: lockingを使用するようにコードを変更することを検討したいと思いますが、問題が解決するかどうかはわかりません。 (私は試してみることができますが、問題は本番にしか現れませんので、修正が必要です。試行錯誤はできません)。 問題がロックされているとは思わない。 – Brock