From a4ca7e3fbae2bfd4660e368684bf0db39f1709d0 Mon Sep 17 00:00:00 2001 From: obdev Date: Thu, 10 Aug 2023 12:12:24 +0000 Subject: [PATCH] [RS] Optimize unit_group choosing logic when shrink tenant unit_num. --- src/rootserver/ob_unit_manager.cpp | 44 +++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/src/rootserver/ob_unit_manager.cpp b/src/rootserver/ob_unit_manager.cpp index a87c38596b..79e5a5b0b9 100644 --- a/src/rootserver/ob_unit_manager.cpp +++ b/src/rootserver/ob_unit_manager.cpp @@ -1700,11 +1700,53 @@ int ObUnitManager::get_to_be_deleted_unit_group( "tenant_unit_group_num", all_unit_group_id_array.count()); } else if (deleted_unit_group_id_array.count() <= 0) { // deleted unit groups not specified by the client, we choose for automatically + // If some servers are inactive, the related unit_group should take priority to be deleted. + ObArray sorted_unit_group_id_array; + // inactive unit_group_id first + ObArray pool_unit_infos; + for (int64_t i = 0; OB_SUCC(ret) && i < pools.count(); ++i) { + if (OB_UNLIKELY(nullptr == pools.at(i))) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("pool ptr is null", KR(ret), KP(pools.at(i))); + } else if (OB_FAIL(inner_get_unit_infos_of_pool(pools.at(i)->resource_pool_id_, pool_unit_infos))) { + LOG_WARN("inner_get_unit_infos_of_pool failed", KR(ret), "resource_pool_id", pools.at(i)->resource_pool_id_); + } else if (pool_unit_infos.count() <= 0) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("pool_unit_infos is empty", KR(ret), "pool_id", pools.at(i)->resource_pool_id_); + } else { + ObServerInfoInTable server_info; + for (int64_t j = 0; OB_SUCC(ret) && j < pool_unit_infos.count(); ++j) { + ObUnit &unit = pool_unit_infos.at(j).unit_; + if (has_exist_in_array(sorted_unit_group_id_array, unit.unit_group_id_)) { + // skip, this unit_group_id has already been added + } else if (OB_FAIL(SVR_TRACER.get_server_info(unit.server_, server_info))) { + LOG_WARN("fail to get_server_info", KR(ret), K(unit)); + } else if (!server_info.is_active()) { + if (OB_FAIL(sorted_unit_group_id_array.push_back(unit.unit_group_id_))) { + LOG_WARN("fail to push_back", KR(ret), K(unit)); + } + } else {/*active server*/} + } + } + } + std::sort(sorted_unit_group_id_array.begin(), sorted_unit_group_id_array.end()); + // then other active unit group id + for (int64_t i = 0; OB_SUCC(ret) && i < all_unit_group_id_array.count(); ++i) { + uint64_t ug_id = all_unit_group_id_array.at(i); + if (has_exist_in_array(sorted_unit_group_id_array, ug_id)) { + // skip, offline unit_group_id is already pushed + } else if (OB_FAIL(sorted_unit_group_id_array.push_back(ug_id))) { + LOG_WARN("fail to push back", KR(ret), K(ug_id)); + } + } for (int64_t i = 0; OB_SUCC(ret) && i < to_be_deleted_num; ++i) { - if (OB_FAIL(to_be_deleted_unit_group.push_back(all_unit_group_id_array.at(i)))) { + if (OB_FAIL(to_be_deleted_unit_group.push_back(sorted_unit_group_id_array.at(i)))) { LOG_WARN("fail to push back", KR(ret)); } } + LOG_INFO("Automatically determined on unit_group to delete for shrinking tenant unit num.", + KR(ret), K(tenant_id), K(new_unit_num), + K(to_be_deleted_unit_group), K(sorted_unit_group_id_array)); } else if (deleted_unit_group_id_array.count() == to_be_deleted_num) { // the deleted unit groups are specified by the client for (int64_t i = 0; OB_SUCC(ret) && i < deleted_unit_group_id_array.count(); ++i) {