diff --git a/cpp/CHANGELOG.md b/cpp/CHANGELOG.md index 67a17013f4a97df1a9b46544c66b0ec06adbaa09..000a012c0a6678b53663124e92a11563051d4593 100644 --- a/cpp/CHANGELOG.md +++ b/cpp/CHANGELOG.md @@ -74,6 +74,7 @@ Please mark all change in change log and use the ticket from JIRA. - MS-442 - Merge Knowhere - MS-445 - Rename CopyCompleted to LoadCompleted - MS-451 - Update server_config.template file, set GPU compute default +- MS-459 - Add cache for pick function in tasktable ## New Feature - MS-343 - Implement ResourceMgr diff --git a/cpp/src/scheduler/Cost.cpp b/cpp/src/scheduler/Cost.cpp deleted file mode 100644 index 724a717d2f32f0475f8d119cbf4fb3ffb8d79092..0000000000000000000000000000000000000000 --- a/cpp/src/scheduler/Cost.cpp +++ /dev/null @@ -1,54 +0,0 @@ -/******************************************************************************* - * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited. - * Proprietary and confidential. - ******************************************************************************/ - -#include "Cost.h" - - -namespace zilliz { -namespace milvus { -namespace engine { - -std::vector -PickToMove(TaskTable &task_table, const CacheMgr &cache_mgr, uint64_t limit) { - std::vector indexes; - for (uint64_t i = 0, count = 0; i < task_table.Size() && count < limit; ++i) { - if (task_table[i]->state == TaskTableItemState::LOADED) { - indexes.push_back(i); - ++count; - } - } - return indexes; -} - - -std::vector -PickToLoad(TaskTable &task_table, uint64_t limit) { - std::vector indexes; - for (uint64_t i = 0, count = 0; i < task_table.Size() && count < limit; ++i) { - if (task_table[i]->state == TaskTableItemState::START) { - indexes.push_back(i); - ++count; - } - } - return indexes; -} - - -std::vector -PickToExecute(TaskTable &task_table, uint64_t limit) { - std::vector indexes; - for (uint64_t i = 0, count = 0; i < task_table.Size() && count < limit; ++i) { - if (task_table[i]->state == TaskTableItemState::LOADED) { - indexes.push_back(i); - ++count; - } - } - return indexes; -} - -} -} -} diff --git a/cpp/src/scheduler/Cost.h b/cpp/src/scheduler/Cost.h deleted file mode 100644 index 76f16d4d1dcbe1b8f4f89ba80a66f34bb9115d64..0000000000000000000000000000000000000000 --- a/cpp/src/scheduler/Cost.h +++ /dev/null @@ -1,48 +0,0 @@ -/******************************************************************************* - * Copyright 上海赜睿信息科技有限公司(Zilliz) - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited. - * Proprietary and confidential. - ******************************************************************************/ -#pragma once - -#include -#include "task/Task.h" -#include "TaskTable.h" -#include "CacheMgr.h" - - -namespace zilliz { -namespace milvus { -namespace engine { - -// TODO: Policy interface -// TODO: collect statistics - -/* - * select tasks to move; - * call from scheduler; - */ -std::vector -PickToMove(TaskTable &task_table, const CacheMgr &cache_mgr, uint64_t limit); - - -/* - * select task to load - * call from resource; - * I DONT SURE NEED THIS; - */ -std::vector -PickToLoad(TaskTable &task_table, uint64_t limit); - -/* - * select task to execute; - * call from resource; - * I DONT SURE NEED THIS; - */ -std::vector -PickToExecute(TaskTable &task_table, uint64_t limit); - - -} -} -} diff --git a/cpp/src/scheduler/Scheduler.cpp b/cpp/src/scheduler/Scheduler.cpp index 03fa479df68a9a99e0002e67bd73dc976e2aa9e1..20183a2876139c01e20f47d09e27edd5dc5aec7b 100644 --- a/cpp/src/scheduler/Scheduler.cpp +++ b/cpp/src/scheduler/Scheduler.cpp @@ -6,7 +6,6 @@ #include #include "Scheduler.h" -#include "Cost.h" #include "action/Action.h" diff --git a/cpp/src/scheduler/TaskTable.cpp b/cpp/src/scheduler/TaskTable.cpp index 2d309d591ca34319b7468725bd9b946b831c3003..56d31e299a8e174397778d14db638454469eb9d8 100644 --- a/cpp/src/scheduler/TaskTable.cpp +++ b/cpp/src/scheduler/TaskTable.cpp @@ -53,6 +53,11 @@ ToString(const TaskTimestamp ×tamp) { return ss.str(); } +bool +TaskTableItem::IsFinish() { + return state == TaskTableItemState::MOVED || state == TaskTableItemState::EXECUTED; +} + bool TaskTableItem::Load() { std::unique_lock lock(mutex); @@ -133,6 +138,38 @@ TaskTableItem::Dump() { return ss.str(); } +std::vector +TaskTable::PickToLoad(uint64_t limit) { + std::vector indexes; + bool cross = false; + for (uint64_t i = last_finish_, count = 0; i < table_.size() && count < limit; ++i) { + if (not cross && table_[i]->IsFinish()) { + last_finish_ = i; + } else if (table_[i]->state == TaskTableItemState::START) { + cross = true; + indexes.push_back(i); + ++count; + } + } + return indexes; +} + +std::vector +TaskTable::PickToExecute(uint64_t limit) { + std::vector indexes; + bool cross = false; + for (uint64_t i = last_finish_, count = 0; i < table_.size() && count < limit; ++i) { + if (not cross && table_[i]->IsFinish()) { + last_finish_ = i; + } else if (table_[i]->state == TaskTableItemState::LOADED) { + cross = true; + indexes.push_back(i); + ++count; + } + } + return indexes; +} + void TaskTable::Put(TaskPtr task) { std::lock_guard lock(id_mutex_); diff --git a/cpp/src/scheduler/TaskTable.h b/cpp/src/scheduler/TaskTable.h index 886259957cd992e68623668d5d51c7e3540cc914..ee6d3b56cb6a16a2e690d39c01a58a54af4b588f 100644 --- a/cpp/src/scheduler/TaskTable.h +++ b/cpp/src/scheduler/TaskTable.h @@ -54,6 +54,9 @@ struct TaskTableItem { uint8_t priority; // just a number, meaningless; + bool + IsFinish(); + bool Load(); @@ -141,6 +144,13 @@ public: std::deque::iterator begin() { return table_.begin(); } std::deque::iterator end() { return table_.end(); } +public: + std::vector + PickToLoad(uint64_t limit); + + std::vector + PickToExecute(uint64_t limit); + public: /******** Action ********/ @@ -182,7 +192,7 @@ public: * Called by executor; */ inline bool - Executed(uint64_t index){ + Executed(uint64_t index) { return table_[index]->Executed(); } @@ -193,7 +203,7 @@ public: */ inline bool - Move(uint64_t index){ + Move(uint64_t index) { return table_[index]->Move(); } @@ -203,7 +213,7 @@ public: * Called by scheduler; */ inline bool - Moved(uint64_t index){ + Moved(uint64_t index) { return table_[index]->Moved(); } @@ -220,6 +230,9 @@ private: mutable std::mutex id_mutex_; std::deque table_; std::function subscriber_ = nullptr; + + // cache last finish avoid Pick task from begin always + uint64_t last_finish_ = 0; }; diff --git a/cpp/src/scheduler/resource/Resource.cpp b/cpp/src/scheduler/resource/Resource.cpp index 75c3b4d78456bf6a42eba2b0acd5d67e5126f21c..d743814699f26b317967c1ddfead0d036179a306 100644 --- a/cpp/src/scheduler/resource/Resource.cpp +++ b/cpp/src/scheduler/resource/Resource.cpp @@ -80,7 +80,7 @@ void Resource::WakeupExecutor() { } TaskTableItemPtr Resource::pick_task_load() { - auto indexes = PickToLoad(task_table_, 10); + auto indexes = task_table_.PickToLoad(10); for (auto index : indexes) { // try to set one task loading, then return if (task_table_.Load(index)) @@ -91,7 +91,7 @@ TaskTableItemPtr Resource::pick_task_load() { } TaskTableItemPtr Resource::pick_task_execute() { - auto indexes = PickToExecute(task_table_, 3); + auto indexes = task_table_.PickToExecute(3); for (auto index : indexes) { // try to set one task executing, then return if (task_table_.Execute(index)) diff --git a/cpp/src/scheduler/resource/Resource.h b/cpp/src/scheduler/resource/Resource.h index dcd5fb5d8f9db407194f88412fe2603570782010..6c0f32689fdfc217782e0156a65db7b6ed161d37 100644 --- a/cpp/src/scheduler/resource/Resource.h +++ b/cpp/src/scheduler/resource/Resource.h @@ -19,7 +19,6 @@ #include "../event/TaskTableUpdatedEvent.h" #include "../TaskTable.h" #include "../task/Task.h" -#include "../Cost.h" #include "Connection.h" #include "Node.h" #include "RegisterHandler.h" diff --git a/cpp/unittest/scheduler/cost_test.cpp b/cpp/unittest/scheduler/cost_test.cpp deleted file mode 100644 index 1a625d786ef5ed6ea2069b0690ea5ca056f942a6..0000000000000000000000000000000000000000 --- a/cpp/unittest/scheduler/cost_test.cpp +++ /dev/null @@ -1,49 +0,0 @@ -#include "scheduler/TaskTable.h" -#include "scheduler/Cost.h" -#include -#include "scheduler/task/TestTask.h" - - -using namespace zilliz::milvus::engine; - -class CostTest : public ::testing::Test { -protected: - void - SetUp() override { - TableFileSchemaPtr dummy = nullptr; - for (uint64_t i = 0; i < 8; ++i) { - auto task = std::make_shared(dummy); - table_.Put(task); - } - table_.Get(0)->state = TaskTableItemState::INVALID; - table_.Get(1)->state = TaskTableItemState::START; - table_.Get(2)->state = TaskTableItemState::LOADING; - table_.Get(3)->state = TaskTableItemState::LOADED; - table_.Get(4)->state = TaskTableItemState::EXECUTING; - table_.Get(5)->state = TaskTableItemState::EXECUTED; - table_.Get(6)->state = TaskTableItemState::MOVING; - table_.Get(7)->state = TaskTableItemState::MOVED; - } - - - TaskTable table_; -}; - -TEST_F(CostTest, pick_to_move) { - CacheMgr cache; - auto indexes = PickToMove(table_, cache, 10); - ASSERT_EQ(indexes.size(), 1); - ASSERT_EQ(indexes[0], 3); -} - -TEST_F(CostTest, pick_to_load) { - auto indexes = PickToLoad(table_, 10); - ASSERT_EQ(indexes.size(), 1); - ASSERT_EQ(indexes[0], 1); -} - -TEST_F(CostTest, pick_to_executed) { - auto indexes = PickToExecute(table_, 10); - ASSERT_EQ(indexes.size(), 1); - ASSERT_EQ(indexes[0], 3); -}