From: Vivek Goyal <vgoyal@redhat.com>
To: Miklos Szeredi <miklos@szeredi.hu>
Cc: Dharmendra Singh <dharamhans87@gmail.com>,
linux-fsdevel@vger.kernel.org,
fuse-devel <fuse-devel@lists.sourceforge.net>,
linux-kernel@vger.kernel.org, Bernd Schubert <bschubert@ddn.com>
Subject: Re: [PATCH v5 0/3] FUSE: Implement atomic lookup + open/create
Date: Thu, 19 May 2022 15:33:44 -0400 [thread overview]
Message-ID: <YoabmCQAWpBY5++X@redhat.com> (raw)
In-Reply-To: <CAJfpegsDxsMsyfP4a_5H1q91xFtwcEdu9-WBnzWKwjUSrPNdmw@mail.gmail.com>
On Thu, May 19, 2022 at 11:39:01AM +0200, Miklos Szeredi wrote:
> On Tue, 17 May 2022 at 12:08, Dharmendra Singh <dharamhans87@gmail.com> wrote:
> >
> > In FUSE, as of now, uncached lookups are expensive over the wire.
> > E.g additional latencies and stressing (meta data) servers from
> > thousands of clients. These lookup calls possibly can be avoided
> > in some cases. Incoming three patches address this issue.
> >
> >
> > Fist patch handles the case where we are creating a file with O_CREAT.
> > Before we go for file creation, we do a lookup on the file which is most
> > likely non-existent. After this lookup is done, we again go into libfuse
> > to create file. Such lookups where file is most likely non-existent, can
> > be avoided.
>
> I'd really like to see a bit wider picture...
>
> We have several cases, first of all let's look at plain O_CREAT
> without O_EXCL (assume that there were no changes since the last
> lookup for simplicity):
Hi Miklos,
Thanks for providing this breakup. There are too many cases here and
this data helps a lot with that. I feel this should really be captured
in commit logs to show the current paths and how these have been
optimized with ATOMIC_OPEN/CREATE_EXT.
>
> [not cached, negative]
> ->atomic_open()
> LOOKUP
> CREATE
>
> [not cached, positive]
> ->atomic_open()
> LOOKUP
> ->open()
> OPEN
>
> [cached, negative, validity timeout not expired]
> ->d_revalidate()
> return 1
> ->atomic_open()
> CREATE
>
> [cached, negative, validity timeout expired]
> ->d_revalidate()
> return 0
> ->atomic_open()
> LOOKUP
> CREATE
>
> [cached, positive, validity timeout not expired]
> ->d_revalidate()
> return 1
> ->open()
> OPEN
>
> [cached, positive, validity timeout expired]
> ->d_revalidate()
> LOOKUP
> return 1
> ->open()
> OPEN
>
> (Caveat emptor: I'm just looking at the code and haven't actually
> tested what happens.)
>
> Apparently in all of these cases we are doing at least one request, so
> it would make sense to make them uniform:
>
> [not cached]
> ->atomic_open()
> CREATE_EXT
>
> [cached]
> ->d_revalidate()
> return 0
So fuse_dentry_revalidate() will return 0 even if timeout has not
expired (if server supports so called atomic_open()).
And that will lead to calling d_invalidate() on existing positive dentry
always. IOW, if I am calling open() on a dentry, dentry will always be
dropped and a new dentry will always be created from ->atomic_open() path,
is that right.
I am not sure what does it mean from VFS perspective to always call
d_invalidate() on a cached positive dentry when open() is called.
/**
* d_invalidate - detach submounts, prune dcache, and drop
* @dentry: dentry to invalidate (aka detach, prune and drop)
*/
Thanks
Vivek
> ->atomic_open()
> CREATE_EXT
>
> Similarly we can look at the current O_CREAT | O_EXCL cases:
>
> [not cached, negative]
> ->atomic_open()
> LOOKUP
> CREATE
>
> [not cached, positive]
> ->atomic_open()
> LOOKUP
> return -EEXIST
>
> [cached, negative]
> ->d_revalidate()
> return 0 (see LOOKUP_EXCL check)
> ->atomic_open()
> LOOKUP
> CREATE
>
> [cached, positive]
> ->d_revalidate()
> LOOKUP
> return 1
> return -EEXIST
>
> Again we are doing at least one request, so we can unconditionally
> replace them with CREATE_EXT like the non-O_EXCL case.
>
>
> >
> > Second patch handles the case where we open first time a file/dir
> > but do a lookup first on it. After lookup is performed we make another
> > call into libfuse to open the file. Now these two separate calls into
> > libfuse can be combined and performed as a single call into libfuse.
>
> And here's my analysis:
>
> [not cached, negative]
> ->lookup()
> LOOKUP
> return -ENOENT
>
> [not cached, positive]
> ->lookup()
> LOOKUP
> ->open()
> OPEN
>
> [cached, negative, validity timeout not expired]
> ->d_revalidate()
> return 1
> return -ENOENT
>
> [cached, negative, validity timeout expired]
> ->d_revalidate()
> return 0
> ->atomic_open()
> LOOKUP
> return -ENOENT
>
> [cached, positive, validity timeout not expired]
> ->d_revalidate()
> return 1
> ->open()
> OPEN
>
> [cached, positive, validity timeout expired]
> ->d_revalidate()
> LOOKUP
> return 1
> ->open()
> OPEN
>
> There's one case were no request is sent: a valid cached negative
> dentry. Possibly we can also make this uniform, e.g.:
>
> [not cached]
> ->atomic_open()
> OPEN_ATOMIC
>
> [cached, negative, validity timeout not expired]
> ->d_revalidate()
> return 1
> return -ENOENT
>
> [cached, negative, validity timeout expired]
> ->d_revalidate()
> return 0
> ->atomic_open()
> OPEN_ATOMIC
>
> [cached, positive]
> ->d_revalidate()
> return 0
> ->atomic_open()
> OPEN_ATOMIC
>
> It may even make the code simpler to clearly separate the cases where
> the atomic variants are supported and when not. I'd also consider
> merging CREATE_EXT into OPEN_ATOMIC, since a filesystem implementing
> one will highly likely want to implement the other as well.
>
> Thanks,
> Miklos
>
next prev parent reply other threads:[~2022-05-19 19:33 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-17 10:07 [PATCH v5 0/3] FUSE: Implement atomic lookup + open/create Dharmendra Singh
2022-05-17 10:07 ` [PATCH v5 1/3] FUSE: Avoid lookups in fuse create Dharmendra Singh
2022-05-17 21:21 ` Vivek Goyal
2022-05-18 17:41 ` Vivek Goyal
2022-05-18 17:44 ` Vivek Goyal
2022-05-18 20:28 ` Bernd Schubert
2022-05-17 10:07 ` [PATCH v5 2/3] FUSE: Rename fuse_create_open() to fuse_atomic_common() Dharmendra Singh
2022-05-17 10:07 ` [PATCH v5 3/3] FUSE: Implement atomic lookup + open Dharmendra Singh
2022-05-19 9:39 ` [PATCH v5 0/3] FUSE: Implement atomic lookup + open/create Miklos Szeredi
2022-05-19 13:13 ` Miklos Szeredi
2022-05-19 17:41 ` Bernd Schubert
2022-05-19 18:16 ` Miklos Szeredi
2022-05-19 20:47 ` [fuse-devel] " Bernd Schubert
2022-05-19 19:33 ` Vivek Goyal [this message]
2023-06-01 11:16 ` Bernd Schubert
2023-06-01 11:50 ` Miklos Szeredi
2023-06-01 12:01 ` Bernd Schubert
2023-06-01 12:18 ` Miklos Szeredi
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=YoabmCQAWpBY5++X@redhat.com \
--to=vgoyal@redhat.com \
--cc=bschubert@ddn.com \
--cc=dharamhans87@gmail.com \
--cc=fuse-devel@lists.sourceforge.net \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=miklos@szeredi.hu \
/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.