From: Miklos Szeredi <miklos@szeredi.hu>
To: Zhao Chen <winters.zc@antgroup.com>
Cc: linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH v3 RESEND 1/2] fuse: Introduce a new notification type for resend pending requests
Date: Thu, 4 Jan 2024 13:03:11 +0100 [thread overview]
Message-ID: <CAJfpegtTzwANHiZty89qo77ryz0XAN4_uDP9oZ4Syx4D4YkiDA@mail.gmail.com> (raw)
In-Reply-To: <20231220084928.298302-2-winters.zc@antgroup.com>
On Wed, 20 Dec 2023 at 09:49, Zhao Chen <winters.zc@antgroup.com> wrote:
>
> When a FUSE daemon panics and failover, we aim to minimize the impact on
> applications by reusing the existing FUSE connection. During this process,
> another daemon is employed to preserve the FUSE connection's file
> descriptor. The new started FUSE Daemon will takeover the fd and continue
> to provide service.
>
> However, it is possible for some inflight requests to be lost and never
> returned. As a result, applications awaiting replies would become stuck
> forever. To address this, we can resend these pending requests to the
> new started FUSE daemon.
>
> This patch introduces a new notification type "FUSE_NOTIFY_RESEND", which
> can trigger resending of the pending requests, ensuring they are properly
> processed again.
>
> Signed-off-by: Zhao Chen <winters.zc@antgroup.com>
> ---
> fs/fuse/dev.c | 64 +++++++++++++++++++++++++++++++++++++++
> include/uapi/linux/fuse.h | 1 +
> 2 files changed, 65 insertions(+)
>
> diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> index 1a8f82f478cb..a5a874b2f2e2 100644
> --- a/fs/fuse/dev.c
> +++ b/fs/fuse/dev.c
> @@ -1775,6 +1775,67 @@ static int fuse_notify_retrieve(struct fuse_conn *fc, unsigned int size,
> return err;
> }
>
> +/*
> + * Resending all processing queue requests.
> + *
> + * During a FUSE daemon panics and failover, it is possible for some inflight
> + * requests to be lost and never returned. As a result, applications awaiting
> + * replies would become stuck forever. To address this, we can use notification
> + * to trigger resending of these pending requests to the FUSE daemon, ensuring
> + * they are properly processed again.
> + *
> + * Please note that this strategy is applicable only to idempotent requests or
> + * if the FUSE daemon takes careful measures to avoid processing duplicated
> + * non-idempotent requests.
> + */
> +static void fuse_resend(struct fuse_conn *fc)
> +{
> + struct fuse_dev *fud;
> + struct fuse_req *req, *next;
> + struct fuse_iqueue *fiq = &fc->iq;
> + LIST_HEAD(to_queue);
> + unsigned int i;
> +
> + spin_lock(&fc->lock);
> + if (!fc->connected) {
> + spin_unlock(&fc->lock);
> + return;
> + }
> +
> + list_for_each_entry(fud, &fc->devices, entry) {
> + struct fuse_pqueue *fpq = &fud->pq;
> +
> + spin_lock(&fpq->lock);
> + list_for_each_entry_safe(req, next, &fpq->io, list) {
Handling of requests on fpq->io is tricky, since they are in the state
of being read or written by the fuse server. Re-queuing it in this
state likely can result in some sort of corruption.
The simplest solution is to just ignore requests in the I/O state. Is
this a good solution for your use case?
Thanks,
Miklos
next prev parent reply other threads:[~2024-01-04 12:03 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-12-20 8:49 [PATCH v3 RESEND 0/2] fuse: Add support for resend pending requests Zhao Chen
2023-12-20 8:49 ` [PATCH v3 RESEND 1/2] fuse: Introduce a new notification type " Zhao Chen
2024-01-04 12:03 ` Miklos Szeredi [this message]
2024-01-09 9:16 ` Zhao Chen
2023-12-20 8:49 ` [PATCH v3 RESEND 2/2] fuse: Use the high bit of request ID for indicating resend requests Zhao Chen
-- strict thread matches above, loose matches on Subject: below --
2023-12-11 12:06 [PATCH v3 RESEND 0/2] fuse: Add support for resend pending requests Zhao Chen
2023-12-11 12:06 ` [PATCH v3 RESEND 1/2] fuse: Introduce a new notification type " Zhao Chen
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=CAJfpegtTzwANHiZty89qo77ryz0XAN4_uDP9oZ4Syx4D4YkiDA@mail.gmail.com \
--to=miklos@szeredi.hu \
--cc=linux-fsdevel@vger.kernel.org \
--cc=winters.zc@antgroup.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).