[Gluster-devel] File lock problem on new files

Kevan Benson kbenson at a-1networks.com
Fri Sep 28 20:04:46 UTC 2007


Hmm, looks like this was fixed some time before or at TLA 494.  Thanks!

Kevan Benson wrote:
>
> I posted this a while back: 
> http://lists.nongnu.org/archive/html/gluster-devel/2007-08/msg00124.html
>
> In summary: Performing a flock operation on a newly created file does 
> not always lock it from other clients.
>
> Process: Open a new file and obtain a lock (flock in my tests) within 
> the same process.  Before closing the file, open and try to obtain a 
> lock from a separate process from a different glusterfs client.  There 
> is no blocking.
>
> Notes: If I create the file beforehand (touch it), the flock operation 
> performs as expected.  Looking at the servers, the file is created 
> immediately from the first client, the second client is just not 
> blocking on the flock call.
>
> Here's a trasncript of operations on the servers, to illustrate the 
> problem.  Both servers are time synced, drift between them is sub 1 
> second:
>
> # Client A
> # ll /mnt/glusterfs/
> total 8
> -rwxr-xr-x  1 root root 746 Sep 21 12:02 testlock.pl
>
> # Client B
> # ll /mnt/glusterfs/
> total 8
> -rwxr-xr-x  1 root root 746 Sep 21 12:02 testlock.pl
>
> # Client A
> # /mnt/glusterfs/testlock.pl /mnt/glusterfs/testfile 10
> testing flock on lockfile /mnt/glusterfs/testfile with 10 second delay 
> on php5-a.graphita.com
> opening file
> Fri Sep 21 14:26:19 2007 :: opened file
> Fri Sep 21 14:26:19 2007 :: locking file
> Fri Sep 21 14:26:19 2007 :: locked file
> Fri Sep 21 14:26:29 2007 :: unlocked file
>
> # Client B
> # /mnt/glusterfs/testlock.pl /mnt/glusterfs/testfile 10
> testing flock on lockfile /mnt/glusterfs/testfile with 10 second delay 
> on php5-b.graphita.com
> opening file
> Fri Sep 21 14:26:21 2007 :: opened file
> Fri Sep 21 14:26:21 2007 :: locking file
> Fri Sep 21 14:26:21 2007 :: locked file
> Fri Sep 21 14:26:31 2007 :: unlocked file
>
>
> Notice that the second client ignored the lock of the first?  Not 
> let's try this again but with the file already existing:
>
> # Client A
> # rm -f /mnt/glusterfs/testfile
> # ll /mnt/glusterfs/
> total 8
> -rwxr-xr-x  1 root root 746 Sep 21 12:02 testlock.pl
> # touch /mnt/glusterfs/testfile
> # ll /mnt/glusterfs/
> total 12
> -rw-r--r--  1 root root   0 Sep 21 14:29 testfile
> -rwxr-xr-x  1 root root 746 Sep 21 12:02 testlock.pl
>
> # Client B
> # ll /mnt/glusterfs/
> total 12
> -rw-r--r--  1 root root   0 Sep 21 14:29 testfile
> -rwxr-xr-x  1 root root 746 Sep 21 12:02 testlock.pl
>
> # Client A
> # /mnt/glusterfs/testlock.pl /mnt/glusterfs/testfile 10
> testing flock on lockfile /mnt/glusterfs/testfile with 10 second delay 
> on php5-a.graphita.com
> opening file
> Fri Sep 21 14:30:33 2007 :: opened file
> Fri Sep 21 14:30:33 2007 :: locking file
> Fri Sep 21 14:30:33 2007 :: locked file
> Fri Sep 21 14:30:43 2007 :: unlocked file
>
> # Client B
> # /mnt/glusterfs/testlock.pl /mnt/glusterfs/testfile 10
> testing flock on lockfile /mnt/glusterfs/testfile with 10 second delay 
> on php5-b.graphita.com
> opening file
> Fri Sep 21 14:30:36 2007 :: opened file
> Fri Sep 21 14:30:36 2007 :: locking file
> Fri Sep 21 14:30:43 2007 :: locked file
> Fri Sep 21 14:30:53 2007 :: unlocked file
>
>
> Now it flocks fine.  Client B had to wait for Client A to unlock for 
> it could lock.  Order of operations doesn't seem to matter, nor which 
> client creates the file compared to which locks first when the file is 
> created prior to lock testing.
>
> Here's the contents of testlock.pl:
> #!/usr/bin/perl
>
> $| = 1;
> use Fcntl ':flock';
>
> my $file = shift or "./testlockfile";
> my $delay = shift or 10;
> my $hostname = `hostname`;
> chomp($hostname);
> print "testing flock on lockfile $file with $delay second delay on 
> $hostname\n";
> print "opening file\n";
> open(my $testfile, '>>', $file) or die("$!\n");
> print localtime(time())." :: opened file\n";
> print localtime(time())." :: locking file\n";
> flock($testfile, LOCK_EX) or die("Error locking :: $!\n");
> print localtime(time())." :: locked file\n";
> print $testfile "$hostname start ".localtime(time())."\n";
> sleep $delay;
> print $testfile "$hostname end ".localtime(time())."\n";
> flock($testfile, LOCK_UN) or die("Error locking :: $!\n");
> print localtime(time())." :: unlocked file\n";
> exit 0;
>
>
>
> _______________________________________________
> Gluster-devel mailing list
> Gluster-devel at nongnu.org
> http://lists.nongnu.org/mailman/listinfo/gluster-devel
> .
>






More information about the Gluster-devel mailing list