diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2012-09-14 17:23:23 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-10-01 18:31:51 -0400 |
commit | ffe5a83005b0d23575ab109755b4cb5518a5d91f (patch) | |
tree | be0a3c83446995a129f040c3bcb7c94b806b768c /fs/nfs/nfs4state.c | |
parent | 8cb7f74eeeb5441811d93f94b6138d4a5a9d8b20 (diff) |
NFS: Slow down state manager after an unhandled error
If the state manager thread is not actually able to fully recover from
some situation, it wakes up waiters, who kick off a new state manager
thread. Quite often the fresh invocation of the state manager is just
as successful.
This results in a livelock as the client dumps thousands of NFS
requests a second on the network in a vain attempt to recover. Not
very friendly.
To mitigate this situation, add a delay in the state manager after
an unhandled error, so that the client sends just a few requests
every second in this case.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/nfs4state.c')
-rw-r--r-- | fs/nfs/nfs4state.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index bd8ed01cb0ea..38eeefd95375 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c | |||
@@ -2015,6 +2015,7 @@ out_error: | |||
2015 | pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s" | 2015 | pr_warn_ratelimited("NFS: state manager%s%s failed on NFSv4 server %s" |
2016 | " with error %d\n", section_sep, section, | 2016 | " with error %d\n", section_sep, section, |
2017 | clp->cl_hostname, -status); | 2017 | clp->cl_hostname, -status); |
2018 | ssleep(1); | ||
2018 | nfs4_end_drain_session(clp); | 2019 | nfs4_end_drain_session(clp); |
2019 | nfs4_clear_state_manager_bit(clp); | 2020 | nfs4_clear_state_manager_bit(clp); |
2020 | } | 2021 | } |