All of lore.kernel.org
 help / color / mirror / Atom feed
From: dai.ngo@oracle.com
To: "J. Bruce Fields" <bfields@fieldses.org>
Cc: chuck.lever@oracle.com, jlayton@redhat.com,
	viro@zeniv.linux.org.uk, linux-nfs@vger.kernel.org,
	linux-fsdevel@vger.kernel.org
Subject: Re: [PATCH RFC v18 02/11] NFSD: Add courtesy client state, macro and spinlock to support courteous server
Date: Tue, 29 Mar 2022 11:19:51 -0700	[thread overview]
Message-ID: <5cddab8d-dd92-6863-78fd-a4608a722927@oracle.com> (raw)
In-Reply-To: <20220329163011.GG29634@fieldses.org>


On 3/29/22 9:30 AM, J. Bruce Fields wrote:
> On Tue, Mar 29, 2022 at 09:20:02AM -0700, dai.ngo@oracle.com wrote:
>> On 3/29/22 8:47 AM, J. Bruce Fields wrote:
>>> On Thu, Mar 24, 2022 at 09:34:42PM -0700, Dai Ngo wrote:
>>>> Update nfs4_client to add:
>>>>   . cl_cs_client_state: courtesy client state
>>>>   . cl_cs_lock: spinlock to synchronize access to cl_cs_client_state
>>>>   . cl_cs_list: list used by laundromat to process courtesy clients
>>>>
>>>> Modify alloc_client to initialize these fields.
>>>>
>>>> Signed-off-by: Dai Ngo <dai.ngo@oracle.com>
>>>> ---
>>>>   fs/nfsd/nfs4state.c |  2 ++
>>>>   fs/nfsd/nfsd.h      |  1 +
>>>>   fs/nfsd/state.h     | 33 +++++++++++++++++++++++++++++++++
>>>>   3 files changed, 36 insertions(+)
>>>>
>>>> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
>>>> index 234e852fcdfa..a65d59510681 100644
>>>> --- a/fs/nfsd/nfs4state.c
>>>> +++ b/fs/nfsd/nfs4state.c
>>>> @@ -2009,12 +2009,14 @@ static struct nfs4_client *alloc_client(struct xdr_netobj name)
>>>>   	INIT_LIST_HEAD(&clp->cl_delegations);
>>>>   	INIT_LIST_HEAD(&clp->cl_lru);
>>>>   	INIT_LIST_HEAD(&clp->cl_revoked);
>>>> +	INIT_LIST_HEAD(&clp->cl_cs_list);
>>>>   #ifdef CONFIG_NFSD_PNFS
>>>>   	INIT_LIST_HEAD(&clp->cl_lo_states);
>>>>   #endif
>>>>   	INIT_LIST_HEAD(&clp->async_copies);
>>>>   	spin_lock_init(&clp->async_lock);
>>>>   	spin_lock_init(&clp->cl_lock);
>>>> +	spin_lock_init(&clp->cl_cs_lock);
>>>>   	rpc_init_wait_queue(&clp->cl_cb_waitq, "Backchannel slot table");
>>>>   	return clp;
>>>>   err_no_hashtbl:
>>>> diff --git a/fs/nfsd/nfsd.h b/fs/nfsd/nfsd.h
>>>> index 4fc1fd639527..23996c6ca75e 100644
>>>> --- a/fs/nfsd/nfsd.h
>>>> +++ b/fs/nfsd/nfsd.h
>>>> @@ -336,6 +336,7 @@ void		nfsd_lockd_shutdown(void);
>>>>   #define COMPOUND_ERR_SLACK_SPACE	16     /* OP_SETATTR */
>>>>   #define NFSD_LAUNDROMAT_MINTIMEOUT      1   /* seconds */
>>>> +#define	NFSD_COURTESY_CLIENT_TIMEOUT	(24 * 60 * 60)	/* seconds */
>>>>   /*
>>>>    * The following attributes are currently not supported by the NFSv4 server:
>>>> diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
>>>> index 95457cfd37fc..40e390abc842 100644
>>>> --- a/fs/nfsd/state.h
>>>> +++ b/fs/nfsd/state.h
>>>> @@ -283,6 +283,35 @@ struct nfsd4_sessionid {
>>>>   #define HEXDIR_LEN     33 /* hex version of 16 byte md5 of cl_name plus '\0' */
>>>>   /*
>>>> + * CLIENT_  CLIENT_ CLIENT_
>>>> + * COURTESY EXPIRED RECONNECTED      Meaning                  Where set
>>>> + * -----------------------------------------------------------------------------
>>>> + * | false | false | false | Confirmed, active    | Default                    |
>>>> + * |---------------------------------------------------------------------------|
>>>> + * | true  | false | false | Courtesy state.      | nfs4_get_client_reaplist   |
>>>> + * |       |       |       | Lease/lock/share     |                            |
>>>> + * |       |       |       | reservation conflict |                            |
>>>> + * |       |       |       | can cause Courtesy   |                            |
>>>> + * |       |       |       | client to be expired |                            |
>>>> + * |---------------------------------------------------------------------------|
>>>> + * | false | true  | false | Courtesy client to be| nfs4_laundromat            |
>>>> + * |       |       |       | expired by Laundromat| nfsd4_lm_lock_expired      |
>>>> + * |       |       |       | due to conflict     | nfsd4_discard_courtesy_clnt |
>>>> + * |       |       |       |                      | nfsd4_expire_courtesy_clnt |
>>>> + * |---------------------------------------------------------------------------|
>>>> + * | false | false | true  | Courtesy client      | nfsd4_courtesy_clnt_expired|
>>>> + * |       |       |       | reconnected,         |                            |
>>>> + * |       |       |       | becoming active      |                            |
>>>> + * -----------------------------------------------------------------------------
> By the way, where is a client returned to the normal (0) state?  That
> has to happen at some point.

For 4.1 courtesy client reconnects is detected in nfsd4_sequence,
nfsd4_bind_conn_to_session. For 4.0 courtesy client reconnects is
detected in set_client.

>
> How is CLIENT_EXPIRED treated differently from cl_time == 0, and why?

cl_time == 0 means the client is being destroyed (almost) immediately
either by the laundromat or force_expire_client.

CLIENT_EXPIRED means the client will be destroyed by the laundromat
and this depends on when the laundromat runs. When we set CLIENT_COURTESY
we don't clear cl_time since the client is not really expired yet.

We could replace CLIENT_EXPIRED with (cl_time == 0). However,
to set cl_time = 0 we need to acquire the nn->client_lock which
causes deadlock when we try to resolve lock conflicts
from nfs4_resolve_deny_conflicts_locked (fp->fi_lock -> nn_clientlock).
We use the cl_cs_lock to set CLIENT_EXPIRED.

>
> Why are RECONNECTED clients discarded in so many cases?  (E.g. whenever
> a bind_conn_to_session fails).

find_in_sessionid_hashtbl: we discard the courtesy client when it
reconnects and there is error from nfsd4_get_session_locked. This
should be a rare condition so rather than reverting the client
state back to courtesy, it is simpler just to discard it.

nfsd4_create_session/find_confirmed_client: I think the only time
the courtesy client sends CREATE_SESSION, before sending the SEQUENCE
to reconnect after missing its leases, is when it wants to do clientid
trunking. This should be a rare condition so instead of dealing
with it we just do not allow it and discard the client for now.

nfsd4_destroy_clientid/find_confirmed_client: instead of destroy
the courtesy client here we just let the laundromat destroy it
as if the client already expired.

nfsd4_setclientid_confirm/find_confirmed_client: there should not
be any courtesy client found from nfsd4_setclientid_confirm, it
should be detected and discarded in nfsd4_setclientid.

-Dai

>>> These are mutually exclusive values, not bits that may set to 0 or 1, so
>>> the three boolean columns are confusing.  I'd just structure the table
>>> like:
>>>
>>> 	client state	meaning			where set
>>> 	0		Confirmed, active	Default
>>> 	CLIENT_COURTESY	Courtesy state....	nfs4_get_client_reaplist
>>> 	CLIENT_EXPIRED	Courtesy client to be..	nfs4_laundromat
>>>
>>> etc.
>> will fix in v19.
>>
>> Thanks,
>> -Dai
>>
>>> --b.
>>>
>>>> + */
>>>> +
>>>> +enum courtesy_client_state {
>>>> +	NFSD4_CLIENT_COURTESY = 1,
>>>> +	NFSD4_CLIENT_EXPIRED,
>>>> +	NFSD4_CLIENT_RECONNECTED,
>>>> +};
>>>> +
>>>> +/*
>>>>    * struct nfs4_client - one per client.  Clientids live here.
>>>>    *
>>>>    * The initial object created by an NFS client using SETCLIENTID (for NFSv4.0)
>>>> @@ -385,6 +414,10 @@ struct nfs4_client {
>>>>   	struct list_head	async_copies;	/* list of async copies */
>>>>   	spinlock_t		async_lock;	/* lock for async copies */
>>>>   	atomic_t		cl_cb_inflight;	/* Outstanding callbacks */
>>>> +
>>>> +	enum courtesy_client_state	cl_cs_client_state;
>>>> +	spinlock_t		cl_cs_lock;
>>>> +	struct list_head	cl_cs_list;
>>>>   };
>>>>   /* struct nfs4_client_reset
>>>> -- 
>>>> 2.9.5

  parent reply	other threads:[~2022-03-29 18:20 UTC|newest]

Thread overview: 31+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-03-25  4:34 [PATCH RFC v18 0/11] NFSD: Initial implementation of NFSv4 Courteous Server Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 01/11] fs/lock: add helper locks_owner_has_blockers to check for blockers Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 02/11] NFSD: Add courtesy client state, macro and spinlock to support courteous server Dai Ngo
2022-03-29 15:47   ` J. Bruce Fields
2022-03-29 16:20     ` dai.ngo
2022-03-29 16:30       ` J. Bruce Fields
2022-03-29 16:42         ` J. Bruce Fields
2022-03-29 18:19         ` dai.ngo [this message]
2022-03-29 18:39           ` J. Bruce Fields
2022-03-29 19:32             ` Chuck Lever III
2022-03-29 19:49               ` Bruce Fields
2022-03-29 19:58                 ` Chuck Lever III
2022-03-29 20:01                   ` Bruce Fields
2022-03-29 20:20                     ` Chuck Lever III
2022-03-29 20:50                     ` dai.ngo
2022-03-29 21:45             ` dai.ngo
2022-03-30  0:12               ` J. Bruce Fields
2022-03-30  1:17                 ` dai.ngo
2022-03-30  1:48                   ` J. Bruce Fields
2022-03-25  4:34 ` [PATCH RFC v18 03/11] NFSD: Add lm_lock_expired call out Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 04/11] NFSD: Update nfsd_breaker_owns_lease() to handle courtesy clients Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 05/11] NFSD: Update nfs4_get_vfs_file() to handle courtesy client Dai Ngo
2022-03-29 15:24   ` J. Bruce Fields
2022-03-29 16:06     ` dai.ngo
2022-03-29 16:11       ` J. Bruce Fields
2022-03-25  4:34 ` [PATCH RFC v18 06/11] NFSD: Update find_clp_in_name_tree() " Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 07/11] NFSD: Update find_in_sessionid_hashtbl() " Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 08/11] NFSD: Update find_client_in_id_table() " Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 09/11] NFSD: Refactor nfsd4_laundromat() Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 10/11] NFSD: Update laundromat to handle courtesy clients Dai Ngo
2022-03-25  4:34 ` [PATCH RFC v18 11/11] NFSD: Show state of courtesy clients in client info Dai Ngo

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=5cddab8d-dd92-6863-78fd-a4608a722927@oracle.com \
    --to=dai.ngo@oracle.com \
    --cc=bfields@fieldses.org \
    --cc=chuck.lever@oracle.com \
    --cc=jlayton@redhat.com \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=viro@zeniv.linux.org.uk \
    /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.