From c8f5b3aa90c0cb7dc2979eb0cac3dec209a6eb18 Mon Sep 17 00:00:00 2001 From: weizuo93 Date: Thu, 13 Aug 2020 21:20:17 +0800 Subject: [PATCH 1/2] Optimize the disk selection strategy on BE for tablet creation --- be/src/olap/data_dir.h | 2 ++ be/src/olap/storage_engine.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+) diff --git a/be/src/olap/data_dir.h b/be/src/olap/data_dir.h index e70083210394cf..5437a489c60b74 100644 --- a/be/src/olap/data_dir.h +++ b/be/src/olap/data_dir.h @@ -124,6 +124,8 @@ class DataDir { void update_user_data_size(int64_t size); + std::set tablet_set() { return _tablet_set; } + private: std::string _cluster_id_path() const { return _path + CLUSTER_ID_PREFIX; } Status _init_cluster_id(); diff --git a/be/src/olap/storage_engine.cpp b/be/src/olap/storage_engine.cpp index b65652b9df5f84..fd6dcf5549dc58 100644 --- a/be/src/olap/storage_engine.cpp +++ b/be/src/olap/storage_engine.cpp @@ -428,6 +428,18 @@ std::vector StorageEngine::get_stores_for_create_tablet( std::random_device rd; srand(rd()); std::random_shuffle(stores.begin(), stores.end()); + // Two random choices + for (int i = 0; i < stores.size();) { + int j = i + 1; + if (j < stores.size()) { + if (stores[i]->tablet_set().size() > stores[j]->tablet_set().size()) { + std::swap(stores[i], stores[j]); + } + i = i + 2; + } else { + break; + } + } return stores; } From d253542537bb00cd3cb23efdda2f3d7557ab4575 Mon Sep 17 00:00:00 2001 From: weizuo93 Date: Thu, 13 Aug 2020 22:24:41 +0800 Subject: [PATCH 2/2] Optimize the disk selection strategy on BE for tablet creation --- be/src/olap/storage_engine.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/be/src/olap/storage_engine.cpp b/be/src/olap/storage_engine.cpp index fd6dcf5549dc58..c8105257073798 100644 --- a/be/src/olap/storage_engine.cpp +++ b/be/src/olap/storage_engine.cpp @@ -429,13 +429,13 @@ std::vector StorageEngine::get_stores_for_create_tablet( srand(rd()); std::random_shuffle(stores.begin(), stores.end()); // Two random choices - for (int i = 0; i < stores.size();) { + for (int i = 0; i < stores.size(); i++) { int j = i + 1; if (j < stores.size()) { if (stores[i]->tablet_set().size() > stores[j]->tablet_set().size()) { std::swap(stores[i], stores[j]); - } - i = i + 2; + } + std::random_shuffle(stores.begin() + j, stores.end()); } else { break; }