From fc7c510e27eae92907c791702f78bed32bd041ad Mon Sep 17 00:00:00 2001 From: Serguei Smirnov Date: Mon, 10 Apr 2023 09:51:47 -0700 Subject: [PATCH] LU-14661 obdclass: Add peer NI when processing llog (again) Construct peers when processing the config log so that LNet has complete information about peer info stored in the config log. These are "temporary" peers which can be overwritten by discovery. In client_import_add_nids_to_conn(), we do not need to hold the import lock when adding NIDs to the obd_uuid, and LNet needs to take the LNet API mutex when adding/modifying peers. We don't want to take the mutex while a spin lock is already being held, so drop the spin lock prior to calling class_add_nids_to_uuid(). Lustre-change: https://review.whamcloud.com/43510 Lustre-commit: 16321de596f6395153be6cbb6192250516963077 [This was problematic when the patch first landed, but was fixed by commit aacb16191a ("LU-14668 lnet: Lock primary NID logic")] Fixes: 759d488fa0 ("EX-6349 revert: Add peer NI when processing llog") HPE-bug-id: LUS-9293 Signed-off-by: Chris Horn Signed-off-by: Serguei Smirnov Change-Id: Ib587ef478251e9722b21210e896838e0344d0e47 Reviewed-by: Frank Sehr Reviewed-by: Andreas Dilger Reviewed-on: https://review.whamcloud.com/c/ex/lustre-release/+/50589 Reviewed-by: Alex Zhuravlev Tested-by: jenkins Tested-by: Maloo --- lustre/ldlm/ldlm_lib.c | 3 ++- lustre/obdclass/lustre_peer.c | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/lustre/ldlm/ldlm_lib.c b/lustre/ldlm/ldlm_lib.c index 18862f1..860e7fc 100644 --- a/lustre/ldlm/ldlm_lib.c +++ b/lustre/ldlm/ldlm_lib.c @@ -183,9 +183,10 @@ int client_import_add_nids_to_conn(struct obd_import *imp, lnet_nid_t *nids, list_for_each_entry(conn, &imp->imp_conn_list, oic_item) { if (class_check_uuid(&conn->oic_uuid, nids[0])) { *uuid = conn->oic_uuid; + spin_unlock(&imp->imp_lock); rc = class_add_nids_to_uuid(&conn->oic_uuid, nids, nid_count); - break; + RETURN(rc); } } spin_unlock(&imp->imp_lock); diff --git a/lustre/obdclass/lustre_peer.c b/lustre/obdclass/lustre_peer.c index d344222..da6411a 100644 --- a/lustre/obdclass/lustre_peer.c +++ b/lustre/obdclass/lustre_peer.c @@ -80,6 +80,7 @@ int class_add_uuid(const char *uuid, __u64 nid) { struct uuid_nid_data *data, *entry; int found = 0; + int rc; LASSERT(nid != 0); /* valid newconfig NID is never zero */ @@ -118,10 +119,17 @@ int class_add_uuid(const char *uuid, __u64 nid) if (found) { CDEBUG(D_INFO, "found uuid %s %s cnt=%d\n", uuid, libcfs_nid2str(nid), entry->un_nid_count); + rc = LNetAddPeer(entry->un_nids, entry->un_nid_count); + CDEBUG(D_INFO, "Add peer %s rc = %d\n", + libcfs_nid2str(data->un_nids[0]), rc); OBD_FREE(data, sizeof(*data)); } else { CDEBUG(D_INFO, "add uuid %s %s\n", uuid, libcfs_nid2str(nid)); + rc = LNetAddPeer(data->un_nids, data->un_nid_count); + CDEBUG(D_INFO, "Add peer %s rc = %d\n", + libcfs_nid2str(data->un_nids[0]), rc); } + return 0; } EXPORT_SYMBOL(class_add_uuid); @@ -171,7 +179,8 @@ int class_add_nids_to_uuid(struct obd_uuid *uuid, lnet_nid_t *nids, int nid_count) { struct uuid_nid_data *entry; - int i; + int i, rc; + bool matched = false; ENTRY; @@ -188,6 +197,8 @@ int class_add_nids_to_uuid(struct obd_uuid *uuid, lnet_nid_t *nids, if (!obd_uuid_equals(&entry->un_uuid, uuid)) continue; + + matched = true; CDEBUG(D_NET, "Updating UUID '%s'\n", obd_uuid2str(uuid)); for (i = 0; i < nid_count; i++) entry->un_nids[i] = nids[i]; @@ -195,6 +206,12 @@ int class_add_nids_to_uuid(struct obd_uuid *uuid, lnet_nid_t *nids, break; } spin_unlock(&g_uuid_lock); + if (matched) { + rc = LNetAddPeer(entry->un_nids, entry->un_nid_count); + CDEBUG(D_INFO, "Add peer %s rc = %d\n", + libcfs_nid2str(entry->un_nids[0]), rc); + } + RETURN(0); } EXPORT_SYMBOL(class_add_nids_to_uuid); -- 1.8.3.1