All of lore.kernel.org
 help / color / mirror / Atom feed
From: "NeilBrown" <neilb@suse.de>
To: "'bfields@fieldses.org'" <bfields@fieldses.org>
Cc: "inoguchi.yuki@fujitsu.com" <inoguchi.yuki@fujitsu.com>,
	"'Trond Myklebust'" <trondmy@hammerspace.com>,
	"'linux-nfs@vger.kernel.org'" <linux-nfs@vger.kernel.org>,
	"'mbenjami@redhat.com'" <mbenjami@redhat.com>
Subject: Re: client caching and locks
Date: Mon, 10 Jan 2022 08:58:55 +1100	[thread overview]
Message-ID: <164176553564.25899.8328729314072677083@noble.neil.brown.name> (raw)
In-Reply-To: <20220105220353.GF25384@fieldses.org>

On Thu, 06 Jan 2022, 'bfields@fieldses.org' wrote:

> +Locking can also provide cache consistency:
>  .P
> -NLM supports advisory file locks only.
> -To lock NFS files, use
> -.BR fcntl (2)
> -with the F_GETLK and F_SETLK commands.
> -The NFS client converts file locks obtained via
> -.BR flock (2)
> -to advisory locks.
> +Before acquiring a file lock, the client revalidates its cached data for
> +the file.  Before releasing a write lock, the client flushes to the
> +server's stable storage any data in the locked range.

Surely the client revalidates *after* acquiring the lock on the server. 
Otherwise the revalidation has now value.

>  .P
> -When mounting servers that do not support the NLM protocol,
> -or when mounting an NFS server through a firewall
> -that blocks the NLM service port,
> -specify the
> -.B nolock
> -mount option. NLM locking must be disabled with the
> -.B nolock
> -option when using NFS to mount
> -.I /var
> -because
> -.I /var
> -contains files used by the NLM implementation on Linux.
> +A distributed application running on multiple NFS clients can take a
> +read lock for each range that it reads and a write lock for each range that
> +it writes.  On its own, however, that is insufficient to ensure that
> +reads get up-to-date data.
>  .P
> -Specifying the
> -.B nolock
> -option may also be advised to improve the performance
> -of a proprietary application which runs on a single client
> -and uses file locks extensively.
> +When revalidating caches, the client is unable to reliably determine the
> +difference between changes made by other clients and changes it made
> +itself.  Therefore, such an application would also need to prevent
> +concurrent writes from multiple clients, either by taking whole-file
> +locks on every write or by some other method.

This looks like it is documenting a bug - I would much rather the bug be
fixed.

If a client opens/reads/closes a file while no other client has the file
open, then it *must* return current data.  Currently (according to
reports) it does not reliably do this.

If a write from this client races with a write from another client
(whether or not locking is used), the fact that fetching the change attr
is not atomic w.r.t IO means that the client *cannot* trust any cached
data after it has closed a file to which it wrote to - unless it had a
delegation.
Hmm.. that sounds a bit convoluted.

1/ If a client opens a file for write but does not get a delegation, and
   then writes to the file, then when it closes the file it *must*
   invalidate any cached data as there could have been a concurrent
   write from another client which is not visible in the changeid
   information. CTO consistency rules allow the client to keep cached
   data up to the close.
2/ If a client opens a file for write and *does* get a delegation, then
   providing it gets a changeid from the server after final write and
   before returning the delegation, it can keep all cached data (until
   the server reports a new changeid).

Note that the inability to cache in '1' *should* *not* be a performance
problem in practice.
a/ if locking is used, cached data is not trusted anyway, so no loss
b/ if locking is not used, then no concurrency is expected, so
   delegations are to be expected, so case '1' doesn't apply.

NeilBrown

  parent reply	other threads:[~2022-01-09 21:59 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-08 21:19 client caching and locks J. Bruce Fields
2020-06-18  9:54 ` inoguchi.yuki
2020-06-18 14:29   ` Trond Myklebust
2020-06-18 20:09     ` bfields
2020-06-22 13:52       ` bfields
2020-10-01 21:47         ` bfields
2020-10-01 22:26           ` Matt Benjamin
2020-10-06 17:26             ` bfields
2021-12-28  2:39               ` inoguchi.yuki
2021-12-28  5:11               ` NeilBrown
2022-01-03 16:20                 ` 'bfields@fieldses.org'
2022-01-04  9:24                   ` inoguchi.yuki
2022-01-04 12:36                     ` Trond Myklebust
2022-01-04 15:32                       ` bfields
2022-01-04 15:54                         ` Trond Myklebust
2022-01-05  9:31                           ` inoguchi.yuki
2022-01-05 22:03                             ` 'bfields@fieldses.org'
2022-01-06  7:23                               ` inoguchi.yuki
2022-01-06 14:16                                 ` 'bfields@fieldses.org'
2022-01-07  8:33                                   ` inoguchi.yuki
2022-01-09 22:16                                   ` NeilBrown
2022-01-09 22:38                                     ` 'bfields@fieldses.org'
2022-01-09 21:58                               ` NeilBrown [this message]
2022-01-09 22:41                                 ` 'bfields@fieldses.org'
2022-01-17  9:09                                 ` inoguchi.yuki
2022-01-17 22:27                                 ` NeilBrown
2022-02-02  4:09                                   ` inoguchi.yuki
2022-02-02  4:25                                     ` Trond Myklebust
2022-02-02  4:44                                   ` NeilBrown
2022-02-03  7:31                                     ` inoguchi.yuki
2022-02-07  4:16                                     ` NeilBrown

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=164176553564.25899.8328729314072677083@noble.neil.brown.name \
    --to=neilb@suse.de \
    --cc=bfields@fieldses.org \
    --cc=inoguchi.yuki@fujitsu.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=mbenjami@redhat.com \
    --cc=trondmy@hammerspace.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.