From 4757d295c714dc322b7c99b9de11b28c75303469 Mon Sep 17 00:00:00 2001 From: weizuo93 Date: Wed, 21 Oct 2020 15:49:54 +0800 Subject: [PATCH] Fix bug and optimize implementation logic of tablets web page --- be/src/http/action/tablets_info_action.cpp | 20 +++++++++----------- be/src/olap/tablet_manager.cpp | 5 ++++- be/src/olap/tablet_manager.h | 2 +- 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/be/src/http/action/tablets_info_action.cpp b/be/src/http/action/tablets_info_action.cpp index 2efe02f2d98069..49d41814f63833 100644 --- a/be/src/http/action/tablets_info_action.cpp +++ b/be/src/http/action/tablets_info_action.cpp @@ -42,26 +42,24 @@ void TabletsInfoAction::handle(HttpRequest *req) { } EasyJson TabletsInfoAction::get_tablets_info(string tablet_num_to_return) { - std::vector tablets_info; - TabletManager* tablet_manager = StorageEngine::instance()->tablet_manager(); - tablet_manager->obtain_all_tablets(tablets_info); - int64_t number; std::string msg; if (tablet_num_to_return == "") { number = 1000; // default msg = "OK"; } else if (tablet_num_to_return == "all") { - number = tablets_info.size(); + number = std::numeric_limits::max(); msg = "OK"; } else if (std::all_of(tablet_num_to_return.begin(), tablet_num_to_return.end(), ::isdigit)) { - int64_t tablet_num = std::atol(tablet_num_to_return.c_str()); - number = tablet_num < tablets_info.size() ? tablet_num : tablets_info.size(); + number = std::atol(tablet_num_to_return.c_str()); msg = "OK"; } else { number = 0; msg = "Parameter Error"; } + std::vector tablets_info; + TabletManager* tablet_manager = StorageEngine::instance()->tablet_manager(); + tablet_manager->obtain_specific_quantity_tablets(tablets_info, number); EasyJson tablets_info_ej; tablets_info_ej["msg"] = msg; @@ -69,12 +67,12 @@ EasyJson TabletsInfoAction::get_tablets_info(string tablet_num_to_return) { EasyJson data = tablets_info_ej.Set("data", EasyJson::kObject); data["host"] = _host; EasyJson tablets = data.Set("tablets", EasyJson::kArray); - for (int64_t i = 0; i < number; i++) { + for (TabletInfo tablet_info : tablets_info) { EasyJson tablet = tablets.PushBack(EasyJson::kObject); - tablet["tablet_id"] = tablets_info[i].tablet_id; - tablet["schema_hash"] = tablets_info[i].schema_hash; + tablet["tablet_id"] = tablet_info.tablet_id; + tablet["schema_hash"] = tablet_info.schema_hash; } - tablets_info_ej["count"] = number; + tablets_info_ej["count"] = tablets_info.size(); return tablets_info_ej; } } // namespace doris diff --git a/be/src/olap/tablet_manager.cpp b/be/src/olap/tablet_manager.cpp index ce2d1369563d22..29f53be487739e 100644 --- a/be/src/olap/tablet_manager.cpp +++ b/be/src/olap/tablet_manager.cpp @@ -1455,11 +1455,14 @@ void TabletManager::_remove_tablet_from_partition(const Tablet& tablet) { } } -void TabletManager::obtain_all_tablets(vector &tablets_info) { +void TabletManager::obtain_specific_quantity_tablets(vector &tablets_info, int64_t num) { for (int32 i = 0; i < _tablet_map_lock_shard_size; i++) { ReadLock rdlock(&_tablet_map_lock_array[i]); for (const auto& item : _tablet_map_array[i]) { for (TabletSharedPtr tablet : item.second.table_arr) { + if (tablets_info.size() >= num) { + return; + } if (tablet == nullptr) { continue; } diff --git a/be/src/olap/tablet_manager.h b/be/src/olap/tablet_manager.h index 6222c53746c3f0..9e3aea64a61db3 100644 --- a/be/src/olap/tablet_manager.h +++ b/be/src/olap/tablet_manager.h @@ -137,7 +137,7 @@ class TabletManager { void do_tablet_meta_checkpoint(DataDir* data_dir); - void obtain_all_tablets(vector &tablets_info); + void obtain_specific_quantity_tablets(vector &tablets_info, int64_t num); void register_clone_tablet(int64_t tablet_id); void unregister_clone_tablet(int64_t tablet_id);