9

在我的生产环境中,我们有一个我们认为是损坏的可存储哈希,由 Storable.pm 创建。我无法复制 Dev 中的行为,这使得准确诊断变得困难。

该代码已经运行了很长时间,导致它中断的更改是从哈希中删除。直到最近,哈希值要么保持不变,要么增长。

文件以读写方式打开,然后 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 回答