From: Chuck Lever III <chuck.lever@oracle.com>
To: Jeff Layton <jlayton@redhat.com>
Cc: Dai Ngo <dai.ngo@oracle.com>, Bruce Fields <bfields@fieldses.org>,
Al Viro <viro@zeniv.linux.org.uk>,
Linux NFS Mailing List <linux-nfs@vger.kernel.org>,
"linux-fsdevel@vger.kernel.org" <linux-fsdevel@vger.kernel.org>
Subject: Re: [PATCH RFC v19 0/11] NFSD: Initial implementation of NFSv4 Courteous Server
Date: Sat, 2 Apr 2022 15:10:08 +0000 [thread overview]
Message-ID: <ACAE8C8A-08D3-4EC1-AB3A-FCBCD7FEC687@oracle.com> (raw)
In-Reply-To: <ed7636103eacc854f032e9cebf7e6a983ac5073e.camel@redhat.com>
> On Apr 2, 2022, at 6:35 AM, Jeff Layton <jlayton@redhat.com> wrote:
>
> On Thu, 2022-03-31 at 09:01 -0700, Dai Ngo wrote:
>> Hi Chuck, Bruce
>>
>> This series of patches implement the NFSv4 Courteous Server.
>>
>> A server which does not immediately expunge the state on lease expiration
>> is known as a Courteous Server. A Courteous Server continues to recognize
>> previously generated state tokens as valid until conflict arises between
>> the expired state and the requests from another client, or the server
>> reboots.
>>
>> v2:
>>
>> . add new callback, lm_expire_lock, to lock_manager_operations to
>> allow the lock manager to take appropriate action with conflict lock.
>>
>> . handle conflicts of NFSv4 locks with NFSv3/NLM and local locks.
>>
>> . expire courtesy client after 24hr if client has not reconnected.
>>
>> . do not allow expired client to become courtesy client if there are
>> waiters for client's locks.
>>
>> . modify client_info_show to show courtesy client and seconds from
>> last renew.
>>
>> . fix a problem with NFSv4.1 server where the it keeps returning
>> SEQ4_STATUS_CB_PATH_DOWN in the successful SEQUENCE reply, after
>> the courtesy client reconnects, causing the client to keep sending
>> BCTS requests to server.
>>
>> v3:
>>
>> . modified posix_test_lock to check and resolve conflict locks
>> to handle NLM TEST and NFSv4 LOCKT requests.
>>
>> . separate out fix for back channel stuck in SEQ4_STATUS_CB_PATH_DOWN.
>>
>> v4:
>>
>> . rework nfsd_check_courtesy to avoid dead lock of fl_lock and client_lock
>> by asking the laudromat thread to destroy the courtesy client.
>>
>> . handle NFSv4 share reservation conflicts with courtesy client. This
>> includes conflicts between access mode and deny mode and vice versa.
>>
>> . drop the patch for back channel stuck in SEQ4_STATUS_CB_PATH_DOWN.
>>
>> v5:
>>
>> . fix recursive locking of file_rwsem from posix_lock_file.
>>
>> . retest with LOCKDEP enabled.
>>
>> v6:
>>
>> . merge witn 5.15-rc7
>>
>> . fix a bug in nfs4_check_deny_bmap that did not check for matched
>> nfs4_file before checking for access/deny conflict. This bug causes
>> pynfs OPEN18 to fail since the server taking too long to release
>> lots of un-conflict clients' state.
>>
>> . enhance share reservation conflict handler to handle case where
>> a large number of conflict courtesy clients need to be expired.
>> The 1st 100 clients are expired synchronously and the rest are
>> expired in the background by the laundromat and NFS4ERR_DELAY
>> is returned to the NFS client. This is needed to prevent the
>> NFS client from timing out waiting got the reply.
>>
>> v7:
>>
>> . Fix race condition in posix_test_lock and posix_lock_inode after
>> dropping spinlock.
>>
>> . Enhance nfsd4_fl_expire_lock to work with with new lm_expire_lock
>> callback
>>
>> . Always resolve share reservation conflicts asynchrously.
>>
>> . Fix bug in nfs4_laundromat where spinlock is not used when
>> scanning cl_ownerstr_hashtbl.
>>
>> . Fix bug in nfs4_laundromat where idr_get_next was called
>> with incorrect 'id'.
>>
>> . Merge nfs4_destroy_courtesy_client into nfsd4_fl_expire_lock.
>>
>> v8:
>>
>> . Fix warning in nfsd4_fl_expire_lock reported by test robot.
>>
>> v9:
>>
>> . Simplify lm_expire_lock API by (1) remove the 'testonly' flag
>> and (2) specifying return value as true/false to indicate
>> whether conflict was succesfully resolved.
>>
>> . Rework nfsd4_fl_expire_lock to mark client with
>> NFSD4_DESTROY_COURTESY_CLIENT then tell the laundromat to expire
>> the client in the background.
>>
>> . Add a spinlock in nfs4_client to synchronize access to the
>> NFSD4_COURTESY_CLIENT and NFSD4_DESTROY_COURTESY_CLIENT flag to
>> handle race conditions when resolving lock and share reservation
>> conflict.
>>
>> . Courtesy client that was marked as NFSD4_DESTROY_COURTESY_CLIENT
>> are now consisdered 'dead', waiting for the laundromat to expire
>> it. This client is no longer allowed to use its states if it
>> reconnects before the laundromat finishes expiring the client.
>>
>> For v4.1 client, the detection is done in the processing of the
>> SEQUENCE op and returns NFS4ERR_BAD_SESSION to force the client
>> to re-establish new clientid and session.
>> For v4.0 client, the detection is done in the processing of the
>> RENEW and state-related ops and return NFS4ERR_EXPIRE to force
>> the client to re-establish new clientid.
>>
>> v10:
>>
>> Resolve deadlock in v9 by avoiding getting cl_client and
>> cl_cs_lock together. The laundromat needs to determine whether
>> the expired client has any state and also has no blockers on
>> its locks. Both of these conditions are allowed to change after
>> the laundromat transits an expired client to courtesy client.
>> When this happens, the laundromat will detect it on the next
>> run and and expire the courtesy client.
>>
>> Remove client persistent record before marking it as COURTESY_CLIENT
>> and add client persistent record before clearing the COURTESY_CLIENT
>> flag to allow the courtesy client to transist to normal client to
>> continue to use its state.
>>
>> Lock/delegation/share reversation conflict with courtesy client is
>> resolved by marking the courtesy client as DESTROY_COURTESY_CLIENT,
>> effectively disable it, then allow the current request to proceed
>> immediately.
>>
>> Courtesy client marked as DESTROY_COURTESY_CLIENT is not allowed
>> to reconnect to reuse itsstate. It is expired by the laundromat
>> asynchronously in the background.
>>
>> Move processing of expired clients from nfs4_laudromat to a
>> separate function, nfs4_get_client_reaplist, that creates the
>> reaplist and also to process courtesy clients.
>>
>> Update Documentation/filesystems/locking.rst to include new
>> lm_lock_conflict call.
>>
>> Modify leases_conflict to call lm_breaker_owns_lease only if
>> there is real conflict. This is to allow the lock manager to
>> resolve the delegation conflict if possible.
>>
>> v11:
>>
>> Add comment for lm_lock_conflict callback.
>>
>> Replace static const courtesy_client_expiry with macro.
>>
>> Remove courtesy_clnt argument from find_in_sessionid_hashtbl.
>> Callers use nfs4_client->cl_cs_client boolean to determined if
>> it's the courtesy client and take appropriate actions.
>>
>> Rename NFSD4_COURTESY_CLIENT and NFSD4_DESTROY_COURTESY_CLIENT
>> with NFSD4_CLIENT_COURTESY and NFSD4_CLIENT_DESTROY_COURTESY.
>>
>> v12:
>>
>> Remove unnecessary comment in nfs4_get_client_reaplist.
>>
>> Replace nfs4_client->cl_cs_client boolean with
>> NFSD4_CLIENT_COURTESY_CLNT flag.
>>
>> Remove courtesy_clnt argument from find_client_in_id_table and
>> find_clp_in_name_tree. Callers use NFSD4_CLIENT_COURTESY_CLNT to
>> determined if it's the courtesy client and take appropriate actions.
>>
>> v13:
>>
>> Merge with 5.17-rc3.
>>
>> Cleanup Documentation/filesystems/locking.rst: replace i_lock
>> with flc_lock, update API's that use flc_lock.
>>
>> Rename lm_lock_conflict to lm_lock_expired().
>>
>> Remove comment of lm_lock_expired API in lock_manager_operations.
>> Same information is in patch description.
>>
>> Update commit messages of 4/4.
>>
>> Add some comment for NFSD4_CLIENT_COURTESY_CLNT.
>>
>> Add nfsd4_discard_courtesy_clnt() to eliminate duplicate code of
>> discarding courtesy client; setting NFSD4_DESTROY_COURTESY_CLIENT.
>>
>> v14:
>>
>> . merge with Chuck's public for-next branch.
>>
>> . remove courtesy_client_expiry, use client's last renew time.
>>
>> . simplify comment of nfs4_check_access_deny_bmap.
>>
>> . add comment about race condition in nfs4_get_client_reaplist.
>>
>> . add list_del when walking cslist in nfs4_get_client_reaplist.
>>
>> . remove duplicate INIT_LIST_HEAD(&reaplist) from nfs4_laundromat
>>
>> . Modify find_confirmed_client and find_confirmed_client_by_name
>> to detect courtesy client and destroy it.
>>
>> . refactor lookup_clientid to use find_client_in_id_table
>> directly instead of find_confirmed_client.
>>
>> . refactor nfsd4_setclientid to call find_clp_in_name_tree
>> directly instead of find_confirmed_client_by_name.
>>
>> . remove comment of NFSD4_CLIENT_COURTESY.
>>
>> . replace NFSD4_CLIENT_DESTROY_COURTESY with NFSD4_CLIENT_EXPIRED.
>>
>> . replace NFSD4_CLIENT_COURTESY_CLNT with NFSD4_CLIENT_RECONNECTED.
>>
>> v15:
>>
>> . add helper locks_has_blockers_locked in fs.h to check for
>> lock blockers
>>
>> . rename nfs4_conflict_clients to nfs4_resolve_deny_conflicts_locked
>>
>> . update nfs4_upgrade_open() to handle courtesy clients.
>>
>> . add helper nfs4_check_and_expire_courtesy_client and
>> nfs4_is_courtesy_client_expired to deduplicate some code.
>>
>> . update nfs4_anylock_blocker:
>> . replace list_for_each_entry_safe with list_for_each_entry
>> . break nfs4_anylock_blocker into 2 smaller functions.
>>
>> . update nfs4_get_client_reaplist:
>> . remove unnecessary commets
>> . acquire cl_cs_lock before setting NFSD4_CLIENT_COURTESY flag
>>
>> . update client_info_show to show 'time since last renew: 00:00:38'
>> instead of 'seconds from last renew: 38'.
>>
>> v16:
>>
>> . update client_info_show to display 'status' as
>> 'confirmed/unconfirmed/courtesy'
>>
>> . replace helper locks_has_blockers_locked in fs.h in v15 with new
>> locks_owner_has_blockers call in fs/locks.c
>>
>> . update nfs4_lockowner_has_blockers to use locks_owner_has_blockers
>>
>> . move nfs4_check_and_expire_courtesy_client from 5/11 to 4/11
>>
>> . remove unnecessary check for NULL clp in find_in_sessionid_hashtb
>>
>> . fix typo in commit messages
>>
>> v17:
>>
>> . replace flags used for courtesy client with enum courtesy_client_state
>>
>> . add state table in nfsd/state.h
>>
>> . make nfsd4_expire_courtesy_clnt, nfsd4_discard_courtesy_clnt and
>> nfsd4_courtesy_clnt_expired as static inline.
>>
>> . update nfsd_breaker_owns_lease to use dl->dl_stid.sc_client directly
>>
>> . fix kernel test robot warning when CONFIG_FILE_LOCKING not defined.
>>
>> v18:
>>
>> . modify 0005-NFSD-Update-nfs4_get_vfs_file-to-handle-courtesy-cli.patch to:
>>
>> . remove nfs4_check_access_deny_bmap, fold this functionality
>> into nfs4_resolve_deny_conflicts_locked by making use of
>> bmap_to_share_mode.
>>
>> . move nfs4_resolve_deny_conflicts_locked into nfs4_file_get_access
>> and nfs4_file_check_deny.
>>
>> v19:
>>
>> . modify 0002-NFSD-Add-courtesy-client-state-macro-and-spinlock-to.patch to
>>
>> . add NFSD4_CLIENT_ACTIVE
>>
>> . redo Courtesy client state table
>>
>> . modify 0007-NFSD-Update-find_in_sessionid_hashtbl-to-handle-cour.patch and
>> 0008-NFSD-Update-find_client_in_id_table-to-handle-courte.patch to:
>>
>> . set cl_cs_client_stare to NFSD4_CLIENT_ACTIVE when reactive
>> courtesy client
>>
>>
>
> Dai,
>
> Do you have a public tree with these patches?
I've been hosting them here:
https://git.kernel.org/pub/scm/linux/kernel/git/cel/linux.git/
in the nfsd-courteous-server branch.
--
Chuck Lever
prev parent reply other threads:[~2022-04-02 15:10 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-31 16:01 [PATCH RFC v19 0/11] NFSD: Initial implementation of NFSv4 Courteous Server Dai Ngo
2022-03-31 16:01 ` [PATCH RFC v19 01/11] fs/lock: add helper locks_owner_has_blockers to check for blockers Dai Ngo
2022-03-31 16:17 ` Chuck Lever III
2022-03-31 16:29 ` dai.ngo
2022-03-31 16:02 ` [PATCH RFC v19 02/11] NFSD: Add courtesy client state, macro and spinlock to support courteous server Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 03/11] NFSD: Add lm_lock_expired call out Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 04/11] NFSD: Update nfsd_breaker_owns_lease() to handle courtesy clients Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 05/11] NFSD: Update nfs4_get_vfs_file() to handle courtesy client Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 06/11] NFSD: Update find_clp_in_name_tree() " Dai Ngo
2022-04-01 15:21 ` J. Bruce Fields
2022-04-01 15:57 ` Chuck Lever III
2022-04-01 19:11 ` dai.ngo
2022-04-13 12:55 ` Bruce Fields
2022-04-13 18:28 ` dai.ngo
2022-04-13 18:42 ` Bruce Fields
2022-04-17 19:07 ` Bruce Fields
2022-04-18 1:18 ` dai.ngo
2022-03-31 16:02 ` [PATCH RFC v19 07/11] NFSD: Update find_in_sessionid_hashtbl() " Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 08/11] NFSD: Update find_client_in_id_table() " Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 09/11] NFSD: Refactor nfsd4_laundromat() Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 10/11] NFSD: Update laundromat to handle courtesy clients Dai Ngo
2022-03-31 16:02 ` [PATCH RFC v19 11/11] NFSD: Show state of courtesy clients in client info Dai Ngo
2022-04-02 10:35 ` [PATCH RFC v19 0/11] NFSD: Initial implementation of NFSv4 Courteous Server Jeff Layton
2022-04-02 15:10 ` Chuck Lever III [this message]
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=ACAE8C8A-08D3-4EC1-AB3A-FCBCD7FEC687@oracle.com \
--to=chuck.lever@oracle.com \
--cc=bfields@fieldses.org \
--cc=dai.ngo@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 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).