Whamcloud - gitweb
LU-9066 ldlm: don't evict client on umount if AST fails 21/23921/10
authorMikhal Pershin <mike.pershin@intel.com>
Thu, 3 Nov 2016 22:17:30 +0000 (06:17 +0800)
committerOleg Drokin <oleg.drokin@intel.com>
Thu, 23 Mar 2017 01:41:16 +0000 (01:41 +0000)
When server is being stopped the AST send is denied and
that AST failure will lead to the unexpected client
eviction.
Patch adds extra checks in ldlm_handle_ast_error() to
distinguish that type of error and proceed without
eviction.

Signed-off-by: Mikhal Pershin <mike.pershin@intel.com>
Change-Id: I57c7f417376ac64c8df4c6d5f68bea5083c0d22f
Reviewed-on: https://review.whamcloud.com/23921
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Fan Yong <fan.yong@intel.com>
Reviewed-by: Niu Yawei <yawei.niu@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/ldlm/ldlm_lockd.c

index 807da6f..651eebe 100644 (file)
@@ -669,6 +669,23 @@ static int ldlm_handle_ast_error(struct ldlm_lock *lock,
                                   libcfs_nid2str(peer.nid));
                        ldlm_lock_cancel(lock);
                        rc = -ERESTART;
+               } else if (rc == -ENODEV || rc == -ESHUTDOWN ||
+                          (rc == -EIO &&
+                           req->rq_import->imp_state == LUSTRE_IMP_CLOSED)) {
+                       /* Upon umount process the AST fails because cannot be
+                        * sent. This shouldn't lead to the client eviction.
+                        * -ENODEV error is returned by ptl_send_rpc() for
+                        *  new request in such import.
+                        * -SHUTDOWN is returned by ptlrpc_import_delay_req()
+                        *  if imp_invalid is set or obd_no_recov.
+                        * Meanwhile there is also check for LUSTRE_IMP_CLOSED
+                        * in ptlrpc_import_delay_req() as well with -EIO code.
+                        * In all such cases errors are ignored.
+                        */
+                       LDLM_DEBUG(lock, "%s AST can't be sent due to a server"
+                                        " %s failure or umount process: rc = %d\n",
+                                        ast_type,
+                                        req->rq_import->imp_obd->obd_name, rc);
                } else {
                        LDLM_ERROR(lock,
                                   "client (nid %s) %s %s AST (req@%p x%llu status %d rc %d), evict it",