Whamcloud - gitweb
LU-17379 lnet: add LNetPeerDiscovered to LNet API
authorSerguei Smirnov <ssmirnov@whamcloud.com>
Mon, 5 Feb 2024 20:14:30 +0000 (12:14 -0800)
committerAndreas Dilger <adilger@whamcloud.com>
Wed, 8 May 2024 05:58:13 +0000 (05:58 +0000)
LNetPeerDiscovered is added to allow lustre check
whether the peer has been successfully discovered by LNet
before attempting to open a connection to it.
For example, given a mount command with a list of NIDs,
Lustre can use LNetAddPeer API to initiate discovery on
every candidate first, and later use LNetPeerDiscovered
to select a reachable peer to connect to.

Lustre-change: https://review.whamcloud.com/53926
Lustre-commit: dba41355565397228f587f13a901b5d762521ed0

Test-Parameters: trivial testlist=sanity-lnet
Signed-off-by: Serguei Smirnov <ssmirnov@whamcloud.com>
Change-Id: I7c9964148a5a2a24d7889b8b4c2e488a433ca258
Reviewed-by: Frank Sehr <fsehr@whamcloud.com>
Reviewed-by: Mikhail Pershin <mpershin@whamcloud.com>
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/54950
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
lnet/include/lnet/api.h
lnet/lnet/peer.c

index 375afd4..92d48f9 100644 (file)
@@ -79,6 +79,7 @@ int LNetGetId(unsigned int index, struct lnet_process_id *id);
 int LNetDist(lnet_nid_t nid, lnet_nid_t *srcnid, __u32 *order);
 lnet_nid_t LNetPrimaryNID(lnet_nid_t nid);
 bool LNetIsPeerLocal(lnet_nid_t nid);
+bool LNetPeerDiscovered(lnet_nid_t nid);
 
 /** @} lnet_addr */
 
index 105d94b..55a7249 100644 (file)
@@ -1375,6 +1375,34 @@ out_unlock:
 }
 EXPORT_SYMBOL(LNetPrimaryNID);
 
+bool
+LNetPeerDiscovered(lnet_nid_t nid)
+{
+       int cpt, disc = false;
+       struct lnet_peer *lp;
+
+       lp = lnet_find_peer(nid);
+       if (!lp)
+               goto out;
+
+       cpt = lnet_net_lock_current();
+       spin_lock(&lp->lp_lock);
+       if (((lp->lp_state & LNET_PEER_DISCOVERED) &&
+           (lp->lp_state & LNET_PEER_NIDS_UPTODATE)) ||
+           (lp->lp_state & LNET_PEER_NO_DISCOVERY))
+               disc = true;
+       spin_unlock(&lp->lp_lock);
+
+       /* Drop refcount from lookup */
+       lnet_peer_decref_locked(lp);
+       lnet_net_unlock(cpt);
+out:
+       CDEBUG(D_NET, "Peer NID %s discovered: %d\n", libcfs_nid2str(nid),
+              disc);
+       return disc;
+}
+EXPORT_SYMBOL(LNetPeerDiscovered);
+
 struct lnet_peer_net *
 lnet_peer_get_net_locked(struct lnet_peer *peer, __u32 net_id)
 {