diff --git a/cpp/CHANGELOG.md b/cpp/CHANGELOG.md index d19723fede468bc2cc052ac722705c68ec1785e0..8d25c19ce8ba1aa3b5b6dd07f84bdde6e39edf5f 100644 --- a/cpp/CHANGELOG.md +++ b/cpp/CHANGELOG.md @@ -15,6 +15,7 @@ Please mark all change in change log and use the ticket from JIRA. - MS-620 - Get table row counts display wrong error code - MS-637 - out of memory when load too many tasks - MS-640 - Cache object size calculate incorrect +- MS-641 - Segment fault(signal 11) in PickToLoad ## Improvement - MS-552 - Add and change the easylogging library diff --git a/cpp/src/scheduler/TaskTable.cpp b/cpp/src/scheduler/TaskTable.cpp index d03d36359e873e74d652ad5ec74d2524edff99fb..2f7576de340c48adbdb3d458e8e0d27c2058a126 100644 --- a/cpp/src/scheduler/TaskTable.cpp +++ b/cpp/src/scheduler/TaskTable.cpp @@ -158,8 +158,9 @@ TaskTableItem::Dump() { std::vector TaskTable::PickToLoad(uint64_t limit) { + std::lock_guard lock(mutex_); size_t count = 0; - for (int j = last_finish_ + 1; j < table_.size(); ++j) { + for (uint64_t j = last_finish_ + 1; j < table_.size(); ++j) { if (not table_[j]) { SERVER_LOG_WARNING << "table[" << j << "] is nullptr"; } @@ -186,6 +187,7 @@ TaskTable::PickToLoad(uint64_t limit) { std::vector TaskTable::PickToExecute(uint64_t limit) { + std::lock_guard lock(mutex_); std::vector indexes; bool cross = false; for (uint64_t i = last_finish_ + 1, count = 0; i < table_.size() && count < limit; ++i) { @@ -202,7 +204,7 @@ TaskTable::PickToExecute(uint64_t limit) { void TaskTable::Put(TaskPtr task) { - std::lock_guard lock(id_mutex_); + std::lock_guard lock(mutex_); auto item = std::make_shared(); item->id = id_++; item->task = std::move(task); @@ -216,7 +218,7 @@ TaskTable::Put(TaskPtr task) { void TaskTable::Put(std::vector& tasks) { - std::lock_guard lock(id_mutex_); + std::lock_guard lock(mutex_); for (auto& task : tasks) { auto item = std::make_shared(); item->id = id_++; @@ -232,6 +234,7 @@ TaskTable::Put(std::vector& tasks) { TaskTableItemPtr TaskTable::Get(uint64_t index) { + std::lock_guard lock(mutex_); return table_[index]; } diff --git a/cpp/src/scheduler/TaskTable.h b/cpp/src/scheduler/TaskTable.h index ad81b5d4392e338012c4edeb48f91ac9a25fd7dd..39e129ab0e29c633357ee844a29885236d977e22 100644 --- a/cpp/src/scheduler/TaskTable.h +++ b/cpp/src/scheduler/TaskTable.h @@ -149,9 +149,6 @@ class TaskTable { } public: - TaskTableItemPtr& operator[](uint64_t index) { - return table_[index]; - } std::deque::iterator begin() { @@ -244,7 +241,7 @@ class TaskTable { private: std::uint64_t id_ = 0; - mutable std::mutex id_mutex_; + mutable std::mutex mutex_; std::deque table_; std::function subscriber_ = nullptr;