Whamcloud - gitweb
LU-8197 ptlrpc: do not reduce replay request deadline 99/20399/4
authorVladimir Saveliev <vladimir.saveliev@seagate.com>
Sat, 21 May 2016 03:10:43 +0000 (06:10 +0300)
committerOleg Drokin <oleg.drokin@intel.com>
Mon, 27 Jun 2016 18:55:55 +0000 (18:55 +0000)
New timeout for a replay request sent to a client with early reply is
calculated without taking into account that new deadline for the
replay request on server side is calculated based upon
obd_recovery_timeout. That results in reducing replay deadline which
forces to early disconnect of the client.

Calculate the timeout sent in early reply to a replay request in
according to new deadline of the replay request on server side.

Seagate-bug-id: MRP-3249
Signed-off-by: Vladimir Saveliev <vladimir.saveliev@seagate.com>
Change-Id: I478ca84a9627816be886a077170285f8af4bfc29
Reviewed-on: http://review.whamcloud.com/20399
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: Mike Pershin <mike.pershin@intel.com>
Reviewed-by: Hongchao Zhang <hongchao.zhang@intel.com>
Reviewed-by: Oleg Drokin <oleg.drokin@intel.com>
lustre/ptlrpc/niobuf.c

index 349638b..3da77ec 100644 (file)
@@ -504,11 +504,24 @@ static void ptlrpc_at_set_reply(struct ptlrpc_request *req, int flags)
         * (to be ignored by client) if it's an error reply during recovery.
          * (bz15815) */
         if (req->rq_type == PTL_RPC_MSG_ERR &&
-            (req->rq_export == NULL || req->rq_export->exp_obd->obd_recovering))
+           (req->rq_export == NULL ||
+            req->rq_export->exp_obd->obd_recovering)) {
                 lustre_msg_set_timeout(req->rq_repmsg, 0);
-        else
-                lustre_msg_set_timeout(req->rq_repmsg,
-                                      at_get(&svcpt->scp_at_estimate));
+       } else {
+               __u32 timeout;
+
+               if (req->rq_export && req->rq_reqmsg != NULL &&
+                   lustre_msg_get_flags(req->rq_reqmsg) &
+                   (MSG_REPLAY | MSG_REQ_REPLAY_DONE | MSG_LOCK_REPLAY_DONE))
+                       timeout = cfs_time_current_sec() -
+                               req->rq_arrival_time.tv_sec +
+                               min(at_extra,
+                                   req->rq_export->exp_obd->
+                                   obd_recovery_timeout / 4);
+               else
+                       timeout = at_get(&svcpt->scp_at_estimate);
+               lustre_msg_set_timeout(req->rq_repmsg, timeout);
+       }
 
        if (req->rq_reqmsg &&
            !(lustre_msghdr_get_flags(req->rq_reqmsg) & MSGHDR_AT_SUPPORT)) {