Whamcloud - gitweb
LU-14536 o2iblnd: don't resend if there's no listener
authorLi Xi <lixi@ddn.com>
Tue, 13 Jul 2021 09:22:39 +0000 (17:22 +0800)
committerAndreas Dilger <adilger@whamcloud.com>
Thu, 15 Jul 2021 02:41:44 +0000 (02:41 +0000)
If there's no listener at remote peer, we will
get IB_CM_REJ_INVALID_SERVICE_ID, currently we
will try to resend which makes the discovery longer
than necessary when connecting to a node which is
not up.
Use -EHOSTUNREACH instead of -ECONNREFUSED,
so we don't end up queued for resend.

Lustre-change: https://review.whamcloud.com/42109
Lustre-commit: 65e3e4050ec5bb371c1c343fca49a605286a086e

Change-Id: Ifaf14bc3ada2e2469669285917e366af669817e2
Test-Parameters: trivial
Signed-off-by: Li Dongyang <dongyangli@ddn.com>
Reviewed-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Reviewed-by: Chris Horn <chris.horn@hpe.com>
Reviewed-by: Amir Shehata <ashehata@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/44222
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lnet/klnds/o2iblnd/o2iblnd_cb.c

index 2d2e5f4..a2512d1 100644 (file)
@@ -2835,6 +2835,7 @@ static void
 kiblnd_rejected(struct kib_conn *conn, int reason, void *priv, int priv_nob)
 {
        struct kib_peer_ni *peer_ni = conn->ibc_peer;
+       int status = -ECONNREFUSED;
 
        LASSERT (!in_interrupt());
        LASSERT (conn->ibc_state == IBLND_CONN_ACTIVE_CONNECT);
@@ -2846,6 +2847,7 @@ kiblnd_rejected(struct kib_conn *conn, int reason, void *priv, int priv_nob)
                break;
 
        case IB_CM_REJ_INVALID_SERVICE_ID:
+               status = -EHOSTUNREACH;
                peer_ni->ibp_retries++;
                kiblnd_check_reconnect(conn, IBLND_MSG_VERSION, 0,
                                       IBLND_REJECT_INVALID_SRV_ID, NULL);
@@ -2956,7 +2958,7 @@ kiblnd_rejected(struct kib_conn *conn, int reason, void *priv, int priv_nob)
                 break;
         }
 
-        kiblnd_connreq_done(conn, -ECONNREFUSED);
+        kiblnd_connreq_done(conn, status);
 }
 
 static void