From 07af09e351ed91f5d93bccbf3424ab529ab8f937 Mon Sep 17 00:00:00 2001 From: LeonChaoHi <15201161716@163.com> Date: Fri, 25 Oct 2024 13:43:50 +0000 Subject: [PATCH] [CP] fix core-dump due to missing lock --- src/rootserver/ob_server_balancer.cpp | 4 ++-- src/rootserver/ob_unit_manager.cpp | 17 +++++++++++++++-- src/rootserver/ob_unit_manager.h | 4 ++++ 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/rootserver/ob_server_balancer.cpp b/src/rootserver/ob_server_balancer.cpp index 49f4f46ca..c9ddc3aa5 100644 --- a/src/rootserver/ob_server_balancer.cpp +++ b/src/rootserver/ob_server_balancer.cpp @@ -333,7 +333,7 @@ int ObServerBalancer::distribute_for_standalone_sys_unit() } else if (!enable_sys_unit_standalone) { ret = OB_STATE_NOT_MATCH; LOG_WARN("sys unit standalone deployment is disabled", K(ret)); - } else if (OB_FAIL(unit_mgr_->get_tenant_unit_servers( + } else if (OB_FAIL(unit_mgr_->get_tenant_unit_servers_( OB_SYS_TENANT_ID, empty_zone, sys_unit_server_array))) { LOG_WARN("fail to get tenant unit server array", K(ret)); } else { @@ -1240,7 +1240,7 @@ int ObServerBalancer::generate_available_servers( LOG_WARN("zone is not in active", K(ret), K(zone_info)); } else if (OB_FAIL(SVR_TRACER.get_servers_of_zone(zone, server_list))) { LOG_WARN("fail to get servers of zone", K(ret), K(zone)); - } else if (OB_FAIL(unit_mgr_->get_tenant_unit_servers( + } else if (OB_FAIL(unit_mgr_->get_tenant_unit_servers_( OB_SYS_TENANT_ID, zone, sys_unit_server_array))) { LOG_WARN("fail to get tenant unit server array", K(ret)); } else { diff --git a/src/rootserver/ob_unit_manager.cpp b/src/rootserver/ob_unit_manager.cpp index e65b45d8f..bf218d217 100644 --- a/src/rootserver/ob_unit_manager.cpp +++ b/src/rootserver/ob_unit_manager.cpp @@ -5426,6 +5426,19 @@ int ObUnitManager::get_tenant_unit_servers( const uint64_t tenant_id, const common::ObZone &zone, common::ObIArray &server_array) const +{ + int ret = OB_SUCCESS; + SpinRLockGuard guard(lock_); + if (OB_FAIL(get_tenant_unit_servers_(tenant_id, zone, server_array))) { + LOG_WARN("fail to get_tenant_unit_servers_", KR(ret), K(tenant_id), K(zone)); + } + return ret; +} + +int ObUnitManager::get_tenant_unit_servers_( + const uint64_t tenant_id, + const common::ObZone &zone, + common::ObIArray &server_array) const { int ret = OB_SUCCESS; ObArray *pools = nullptr; @@ -5768,14 +5781,14 @@ int ObUnitManager::get_excluded_servers(const uint64_t resource_pool_id, } } // get all tenant resource pool related servers on target zone - else if (OB_FAIL(get_tenant_unit_servers(tenant_id, zone, excluded_servers))) { + else if (OB_FAIL(get_tenant_unit_servers_(tenant_id, zone, excluded_servers))) { LOG_WARN("get tennat unit server fail", KR(ret), K(tenant_id), K(zone)); } if (OB_SUCC(ret) && GCONF.enable_sys_unit_standalone) { // When the system tenant is deployed independently, // the server where the unit of the system tenant is located is also required as the executed servers - if (OB_FAIL(get_tenant_unit_servers(OB_SYS_TENANT_ID, zone, sys_standalone_servers))) { + if (OB_FAIL(get_tenant_unit_servers_(OB_SYS_TENANT_ID, zone, sys_standalone_servers))) { LOG_WARN("fail to get tenant unit servers", KR(ret), K(zone)); } else if (OB_FAIL(append(excluded_servers, sys_standalone_servers))) { LOG_WARN("fail to append other excluded servers", K(ret)); diff --git a/src/rootserver/ob_unit_manager.h b/src/rootserver/ob_unit_manager.h index 12f458a18..b5bcf3a06 100644 --- a/src/rootserver/ob_unit_manager.h +++ b/src/rootserver/ob_unit_manager.h @@ -395,6 +395,10 @@ private: const bool is_manual = false); int get_zone_units(const common::ObArray &pools, common::ObArray &zone_units) const; + int get_tenant_unit_servers_( + const uint64_t tenant_id, + const common::ObZone &zone, + common::ObIArray &server_array) const; virtual int end_migrate_unit(const uint64_t unit_id, const EndMigrateOp end_migrate_op = COMMIT); int get_excluded_servers( const share::ObUnit &unit,