Storable.pm - 保存到非截断文件时损坏

时间:2010-11-24 01:02:34

标签: perl hash storable

在我的生产环境中,我们拥有了我们认为的一个 由Storable.pm创建的腐败可存储哈希值。我无法复制Dev中的行为,这使得很难准确诊断。

代码已经工作了很长时间,并且已经发生了变化 break正在从哈希中删除。哈希直到最近 保持相同的规模或增长。

在readwrite中打开文件,然后store_fd写入该文件。 由于散列现在(有时)较小,因此它会写入1000bytes 这个2000byte的文件。尾部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 个答案:

答案 0 :(得分:1)

我不知道Storable处理垃圾尾随的情况有多好,但肯定添加不会有什么害处

truncate $sf, tell($sf);
在致电store_fd之后,消除了对现在和将来是否可以处理它的疑问。

答案 1 :(得分:0)

抱歉,我以为我更新了这个。

我问perl5搬运工,并得到了问题的答案。

我没有实现修复,因为我无法在测试中复制,所以不想推送到我的生产环境,我的解决方案目前更安全。

基于perl5-porters的答案,截断绝对是一个好主意。

我不知道有人(或可能!)对我的问题表示赞赏。