Storable.pm - поврежден при сохранении в необрезанный файл

В моей производственной среде у нас было то, что мы считаем поврежденный хранимый хеш, созданный Storable.pm. Я не могу воспроизвести поведение в Dev, что затрудняет точную диагностику.

Код работает давно, и внесенные в него изменения break удалялся из хеша. До недавнего времени хеш остался того же размера или вырос.

Файл открывается в режиме чтения и записи, а затем store_fd записывает в файл. Поскольку хэш теперь (иногда) меньше, он будет записывать, скажем, 1000 байт в этот файл размером 2000 байт. Последние 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. Приведенный выше код, удаление и добавление, удаление и добавление, отлично работает в моем тестовом случае. Жестяная банка вы предлагаете любую последовательность тестовых примеров это может привести к сбою из-за необрезанный файл? (Я знаю это это действительно расплывчатый вопрос, так что почувствуйте можно его игнорировать).
9
задан Brian Tompsett - 汤莱恩 11 July 2015 в 20:13
поделиться