I'm planning on having a complicated file sharing setup, and want to make sure I don't destroy file locking. (Wanting to use bind mounting, nfs, nfs over rdma (InfiniBand file sharing), and virtfs (kvm virtual machine pass-through file sharing) on the same data.)
I'm at the beginning sanity checks, just testing the nfs server with a single nfs client. Up to date Arch on both systems, nfs-utils 1.3.2-6, kernel 4.1.6-1.
I'm seeing unexpected results. On the nfs server:
server exports with: /test 192.168.0.0/16(rw,sync,no_subtree_check,
no_root_squash)
client mount shows: 192.168.1.2:/test on /test type nfs4 (rw,noatime,vers=4.2,
rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,port=0,timeo=600,
retrans=2,sec=sys,clientaddr=192.168.1.3,local_lock=none,addr=192.168.1.2)
In /test, I have a script named lockFile
with contents:
#!/bin/bash
filename="lockedFile"
exec 200>$filename
flock -n 200 || exit 1
pid=$$
while true; do
echo $pid 1>&200
done
If I use two terminals on the nfs server:
1: ./lockFile
2: ./lockFile
Then, terminal 1 quickly fills up a file with its pid, and terminal 2 immediately exits. All as expected.
But, if I run a terminal each on the nfs server and client:
server: ./lockFile
client: ./lockFile
They both happily run, very unexpected.
In this configuration, my nfs server is running as sync
, meaning the server only says data is written when it is actually written. My nfs client is running as async
, meaning the client only transmits the writes when the file is closed.
I could see the client running async
perhaps not obtaining a lock until it actually transmits the writes, so I tested this, changing the client to sync
.
client mount now shows: 192.168.1.2:/test on /test type nfs4 (rw,noatime,sync,
vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,port=0,timeo=600,
retrans=2,sec=sys,clientaddr=192.168.1.3,local_lock=none,addr=192.168.1.2)
Still lockFile
happily runs on both machines.
Am I misunderstanding how NFS file locking is expected to work? Is it expected to handle server access vs client access? Or, is it just for client access vs different client access?
flock()
. It does work withlockf()
. I am runningrpc.statd
with NFS3 on "recent enough" kernels. – Chris Davies Jul 25 '16 at 16:15