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