Re: sm notify (nlm) question

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue, May 14, 2024 at 6:13 PM Frank Filz <ffilzlnx@xxxxxxxxxxxxxx> wrote:
>
>
>
> > -----Original Message-----
> > From: Olga Kornievskaia [mailto:aglo@xxxxxxxxx]
> > Sent: Tuesday, May 14, 2024 2:50 PM
> > To: Frank Filz <ffilzlnx@xxxxxxxxxxxxxx>
> > Cc: Chuck Lever III <chuck.lever@xxxxxxxxxx>; Linux NFS Mailing List <linux-
> > nfs@xxxxxxxxxxxxxxx>
> > Subject: Re: sm notify (nlm) question
> >
> > On Tue, May 14, 2024 at 5:36 PM Frank Filz <ffilzlnx@xxxxxxxxxxxxxx> wrote:
> > >
> > > > > On May 14, 2024, at 2:56 PM, Olga Kornievskaia <aglo@xxxxxxxxx>
> > wrote:
> > > > >
> > > > > Hi folks,
> > > > >
> > > > > Given that not everything for NFSv3 has a specification, I post a
> > > > > question here (as it concerns linux v3 (client) implementation)
> > > > > but I ask a generic question with respect to NOTIFY sent by an NFS server.
> > > >
> > > > There is a standard:
> > > >
> > > > https://pubs.opengroup.org/onlinepubs/9629799/chap11.htm
> > > >
> > > >
> > > > > A NOTIFY message that is sent by an NFS server upon reboot has a
> > > > > monitor name and a state. This "state" is an integer and is
> > > > > modified on each server reboot. My question is: what about state
> > > > > value uniqueness? Is there somewhere some notion that this value
> > > > > has to be unique (as in say a random value).
> > > > >
> > > > > Here's a problem. Say a client has 2 mounts to ip1 and ip2 (both
> > > > > representing the same DNS name) and acquires a lock per mount. Now
> > > > > say each of those servers reboot. Once up they each send a NOTIFY
> > > > > call and each use a timestamp as basis for their "state" value --
> > > > > which very likely is to produce the same value for 2 servers
> > > > > rebooted at the same time (or for the linux server that looks like
> > > > > a counter). On the client side, once the client processes the 1st
> > > > > NOTIFY call, it updates the "state" for the monitor name (ie a
> > > > > client monitors based on a DNS name which is the same for ip1 and
> > > > > ip2) and then in the current code, because the 2nd NOTIFY has the
> > > > > same "state" value this NOTIFY call would be ignored. The linux
> > > > > client would never reclaim the 2nd lock (but the application
> > > > > obviously would never know it's missing a lock)
> > > > > --- data corruption.
> > > > >
> > > > > Who is to blame: is the server not allowed to send "non-unique"
> > > > > state value? Or is the client at fault here for some reason?
> > > >
> > > > The state value is supposed to be specific to the monitored host. If
> > > > the client is indeed ignoring the second reboot notification, that's incorrect
> > behavior, IMO.
> > >
> > > If you are using multiple server IP addresses with the same DNS name, you
> > may want to set:
> > >
> > > sysctl fs.nfs.nsm_use_hostnames=0
> > >
> > > The NLM will register with statd using the IP address as name instead of host
> > name. Then your two IP addresses will each have a separate monitor entry and
> > state value monitored.
> >
> > In my setup I already have this set to 0. But I'll look around the code to see what
> > it is supposed to do.
>
> Hmm, maybe it doesn't work on the client side. I don't often test NLM clients with my Ganesha work because I only run one VM and NLM clients can’t function on the same host as any server other than knfsd...

I've been staring and tracing the code and here's what I conclude: the
use of nsm_use_hostname toggles nothing that helps. No matter what
statd always stores whatever it is monitoring based on the DSN name
(looks like git blame says it's due to nfs-utils's commit
0da56f7d359475837008ea4b8d3764fe982ef512 "statd - use dnsname to
ensure correct matching of NOTIFY requests". Now what's worse is that
when statd receives a 2nd monitoring request from lockd for something
that maps to the same DNS name, statd overwrites the previous
monitoring information it had. When a NOTIFY arrives from an IP
matching the DNS name, the statd does the downcall and it will send
whatever the last monitoring information lockd gave it. Therefore all
the other locks will never be recovered.

What I struggle with is how to solve this problem. Say ip1 and ip2 run
an NFS server and both are known under the same DNS name: foo.bar.com.
Does it mean that they represent the "same" server? Can we assume that
if one of them "rebooted" then the other rebooted as well?  It seems
like we can't go backwards and go back to monitoring by IP. In that
case I can see that we'll get in trouble if the rebooted server indeed
comes back up with a different IP (same DNS name) and then it would
never match the old entry and the lock would never be recovered (but
then also I think lockd will only send the lock to the IP is stored
previously which in this case would be unreachable). If statd
continues to monitor by DNS name and then matches either ips to the
stored entry, then the problem comes with "state" update. Once statd
processes one NOTIFY which matched the DNS name its state "should" be
updated but then it would leads us back into the problem if ignoring
the 2nd NOTIFY call. If statd were to be changed to store multiple
monitor handles lockd asked to monitor, then when the 1st NOTIFY call
comes we can ask lockd to recover "all" the store handles. But then it
circles back to my question: can we assume that if one IP rebooted
does it imply all IPs rebooted?

Perhaps it's lockd that needs to change in how it keeps track of
servers that hold locks. The behaviour seems to have changed in 2010
(with commit 8ea6ecc8b0759756a766c05dc7c98c51ec90de37 "lockd: Create
client-side nlm_host cache") when nlm_host cache was introduced
written to be based on hash of IP. It seems that before things were
based on a DNS name making it in line with statd.

Anybody has any thoughts as to whether statd or lockd needs to change?





[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux