In my production environment we have had what we believe to be a corrupt storable. I am unable to replicate the behaviour in Dev, which has made it hard to diagnose exactly.

The code has been working for a long time, and the change that made it break was deleting from the hash. Up until recently, the hash either stayed the same size, or grew.

The file is opened in readwrite, and then store_fd writes to the file. As the hash is now (sometimes) smaller, it will write say 1000bytes to this 2000byte file. The tail 1000 bytes are old, garbage data. In my test cases, when I retrieve the hash, the garbage data is ignored, as expected.

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);

My questions:

  1. Should this work, or is it imperative that I truncate the file?
  2. Does the stored hash use some kind of file terminator character? If so, what is it?
  3. The above code, deleting and adding and deleting and adding, works perfectly in my test case. Can you suggest any test case sequence that might cause it to fail, due to the non-truncated file? (I know this is a really vague question, so feel free to ignore it).

Thanks, Brock


In reply to Storable.pm - corrupt when saving to non-truncated file by antiquark

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.