From 3a262e5e8a0d2f40982721167bd2be71a2966597 Mon Sep 17 00:00:00 2001 From: godyangfight Date: Wed, 7 Feb 2024 07:58:39 +0000 Subject: [PATCH] Fix rebuild check member list send rpc to location cache leader witch is already not exist. --- .../high_availability/ob_storage_ha_dag.cpp | 23 +++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/storage/high_availability/ob_storage_ha_dag.cpp b/src/storage/high_availability/ob_storage_ha_dag.cpp index 14079f7206..071ffab706 100644 --- a/src/storage/high_availability/ob_storage_ha_dag.cpp +++ b/src/storage/high_availability/ob_storage_ha_dag.cpp @@ -418,25 +418,40 @@ int ObStorageHADagUtils::check_self_is_valid_member( const uint64_t tenant_id = MTL_ID(); share::ObLocationService *location_service = nullptr; const bool force_renew = true; - common::ObAddr leader_addr; ObLSService *ls_service = nullptr; storage::ObStorageRpc *storage_rpc = nullptr; obrpc::ObFetchLSMemberAndLearnerListInfo member_info; storage::ObStorageHASrcInfo src_info; src_info.cluster_id_ = GCONF.cluster_id; const ObAddr &self_addr = GCONF.self_addr_; + ObLSHandle ls_handle; + ObLS *ls = nullptr; + if (!ls_id.is_valid()) { ret = OB_INVALID_ARGUMENT; LOG_WARN("check self in member list get invalid argument", K(ret), K(ls_id)); } else if (OB_ISNULL(location_service = GCTX.location_service_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("location service should not be NULL", K(ret), KP(location_service)); - } else if (OB_FAIL(location_service->get_leader(src_info.cluster_id_, tenant_id, ls_id, force_renew, leader_addr))) { - LOG_WARN("fail to get ls leader server", K(ret), K(tenant_id), K(ls_id)); - } else if (FALSE_IT(src_info.src_addr_ = leader_addr)) { } else if (OB_ISNULL(ls_service = MTL(ObLSService *))) { ret = OB_ERR_UNEXPECTED; LOG_WARN("ls service should not be NULL", K(ret), K(tenant_id), K(ls_id)); + } else if (OB_FAIL(ls_service->get_ls(ls_id, ls_handle, ObLSGetMod::STORAGE_MOD))) { + LOG_WARN("failed to get ls", K(ret), K(ls_id)); + } else if (OB_ISNULL(ls = ls_handle.get_ls())) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("ls should not be NULL", K(ret), KP(ls), K(ls_id)); + } else if (OB_FAIL(ls->get_log_handler()->get_election_leader(src_info.src_addr_))) { + LOG_WARN("failed to get election leader", K(ret), K(tenant_id), K(ls_id)); + if (OB_LEADER_NOT_EXIST == ret) { + //overwrite ret + if (OB_FAIL(location_service->get_leader(src_info.cluster_id_, tenant_id, ls_id, force_renew, src_info.src_addr_))) { + LOG_WARN("failed to get ls leader server", K(ret), K(tenant_id), K(ls_id)); + } + } + } + + if (OB_FAIL(ret)) { } else if (OB_ISNULL(storage_rpc = ls_service->get_storage_rpc())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("storage rpc should not be NULL", K(ret), K(tenant_id), K(ls_id));