Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight

Comment on

( #3333=superdoc: print w/replies, xml ) Need Help??
I suspect this test does not do what you think it does. In particular, consider the case that one process opens the file and writes to it, then another process opens the same file and, perhaps, writes to it, then the if ($f) test executes in the first process. Is the result any different because of what the other process did? I think you will find it is not and, therefore, that the statements in the if block are not as protected as you think they are.
Notice also "my $f = undef" and "unless (-e $filename)"
my $f=undef; getlock sub { unless (-e $filename) { open ($f, ">", $filename) or confess; binmode $f; } }; if ($f) {
( I admit that this code is unclear )
Whether your problem is solved depends on what you are trying to do, which you don't say, but what you are calling a solution seems strange to me.
That was proof of concept code, it contained a bug. Bug found, thus solved.
what you are trying to do, which you don't say
This was proof-of-concept code. I.e. I simplified my 1000 lines program to this code. Thus what I am trying to do is behind the scene, and we should focus only on technical part of problem, not business requirements.
If I post my original code, this would require at least couple of hours to set up things and reproduce the problem for anyone who tries to.
the test could pass but another process could modify the source file before the copy executes
Yes, but btw there are no concurrent writes to same file.
Changing the test on the die to 40_000_000 != -s $newfilename makes little difference to the outcome: there is still a variable subset of the possible 25 copied files and there are still several of them with fewer than 40_000_000 characters.
Well, it indeed does not fix program to output correct files, but it causes some processes to DIE, thus eliminating a bug. See assertions.

Actual fix is to extend lock to whole program, until copy is done (as other posters suggested). Or even just extend it to the point when write to source file is done and file is closed.

In reply to Re^4: Strange IO + concurrency issue by vsespb
in thread [SOLVED] Strange IO + concurrency issue by vsespb

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, 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, 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.
  • Log In?

    What's my password?
    Create A New User
    and all is quiet...

    How do I use this? | Other CB clients
    Other Users?
    Others taking refuge in the Monastery: (4)
    As of 2018-05-22 22:04 GMT
    Find Nodes?
      Voting Booth?