Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

Re: What the flock!? Concurrency issues in file writing.

by moritz (Cardinal)
on Oct 01, 2008 at 15:57 UTC ( #714819=note: print w/replies, xml ) Need Help??


in reply to What the flock!? Concurrency issues in file writing.

You don't check the return value of flock. It can fail, like every other system call.
  • Comment on Re: What the flock!? Concurrency issues in file writing.

Replies are listed 'Best First'.
Re^2: What the flock!? Concurrency issues in file writing.
by suaveant (Parson) on Oct 01, 2008 at 16:33 UTC
    Well, here is an example I ran on the redhat boxes at work and my debian box at home, it shows bad data on both systems if run enough (usually 20 iterations will do it). I also added a check for syswrite... doesn't seem to be writing short data.

    #!/usr/bin/perl use Fcntl qw(:DEFAULT :flock); use strict; my $FH; my $fn = 'flockdata'; my $test_data = (join('','a'..'z')."\n") x 10; #print length($test_data),"\n"; sysopen($FH,$fn,O_WRONLY|O_CREAT); for(1..10) { last unless fork(); } for(1..20) { die "FLOCK ERROR\n" unless flock($FH,LOCK_EX); die "SYSWRITE ERROR\n" unless syswrite($FH,$test_data,length($test_d +ata)) == \ length($test_data); flock($FH,LOCK_UN); } close $FH;
    and to run it when named testflock.pl
    perl -e 'system(q{perl testflock.pl ; ls -al flockdata; rm flockdata}) + for 1..20'

                    - Ant
                    - Some of my best work - (1 2 3)

      As I mentioned before you must put a sysseek in there (e.g. after the flock, but before the syswrite). If you don't you will see corruption since a single process will have a stale version of the current EOF for it's file descriptor.

      I also see corruption with your code on my mac. I don't see it if there is a sysseek($FH, 0, 2). You mentioned that sysseek() "broke everything". When you put it back in this code, and check for error returns, what do you see?

Re^2: What the flock!? Concurrency issues in file writing.
by Anonymous Monk on Oct 01, 2008 at 16:00 UTC
    But it should block indefinitely (hes not using LOCK_NB), so it shouldn't fail ... syswrite/seek still could :)
      If there were no failure conditions for flock, then I'm sure the documentation wouldn't say
      Returns true for success, false on failure

      I'm not quite sure what the exact failure condition is in which flock neither waits for the lock nor dies, but it seems to exist.

      (Update: It seems that it only will fail if LOCK_NB is used, but I'm not entirely sure).

        Yeah, flock can fail, but that's typically a case of running out of system resources; possibly, but rare. It doesn't seem the OP is describing a case that happens only third blue moon.

        It doesn't mean you shouldn't check the return value of flock, but I doubt that this is the cause of the problem.

Re^2: What the flock!? Concurrency issues in file writing.
by suaveant (Parson) on Oct 01, 2008 at 16:04 UTC
    Hrm... good point, but I just put in logging to check that, still getting bad data, but flock never returning false.

                    - Ant
                    - Some of my best work - (1 2 3)

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://714819]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others browsing the Monastery: (5)
As of 2022-12-03 06:59 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found

    Notices?