From 950876b496ab132ee2140e706eaba001347e0a2b Mon Sep 17 00:00:00 2001 From: levlam Date: Tue, 1 Feb 2022 18:25:02 +0300 Subject: [PATCH] Minor improvements. --- td/telegram/SequenceDispatcher.cpp | 8 +++--- tdutils/td/utils/ChainScheduler.h | 42 ++++++++++++++---------------- tdutils/test/ChainScheduler.cpp | 32 +++++++++++++---------- 3 files changed, 42 insertions(+), 40 deletions(-) diff --git a/td/telegram/SequenceDispatcher.cpp b/td/telegram/SequenceDispatcher.cpp index cfc92e9df..93cf04d91 100644 --- a/td/telegram/SequenceDispatcher.cpp +++ b/td/telegram/SequenceDispatcher.cpp @@ -347,10 +347,10 @@ class MultiSequenceDispatcherNewImpl final : public MultiSequenceDispatcherNew { } }); - for (auto task_id : to_check_timeout) { - if (check_timeout(task_id)) { - scheduler_.pause_task(task_id); - try_resend(task_id); + for (auto dependent_task_id : to_check_timeout) { + if (check_timeout(dependent_task_id)) { + scheduler_.pause_task(dependent_task_id); + try_resend(dependent_task_id); } } } diff --git a/tdutils/td/utils/ChainScheduler.h b/tdutils/td/utils/ChainScheduler.h index 2f2808767..c62a254b1 100644 --- a/tdutils/td/utils/ChainScheduler.h +++ b/tdutils/td/utils/ChainScheduler.h @@ -10,6 +10,7 @@ #include "td/utils/common.h" #include "td/utils/Container.h" #include "td/utils/List.h" +#include "td/utils/logging.h" #include "td/utils/optional.h" #include "td/utils/Span.h" #include "td/utils/StringBuilder.h" @@ -29,7 +30,7 @@ struct ChainSchedulerBase { }; template -class ChainScheduler : public ChainSchedulerBase { +class ChainScheduler final : public ChainSchedulerBase { public: using TaskId = uint64; using ChainId = uint64; @@ -96,7 +97,7 @@ class ChainScheduler : public ChainSchedulerBase { } return static_cast(*chain_node->get_next()).task_id; } - optional get_parent(ChainNode *chain_node) { + optional get_parent(ChainNode *chain_node) { if (chain_node->get_prev() == head_.end()) { return {}; } @@ -117,8 +118,8 @@ class ChainScheduler : public ChainSchedulerBase { f(node.task_id, node.generation); } } - void foreach_child(ListNode *node, std::function f) const { - for (auto it = node; it != head_.end(); it = it->get_next()) { + void foreach_child(ListNode *start_node, std::function f) const { + for (auto it = start_node; it != head_.end(); it = it->get_next()) { auto &node = static_cast(*it); f(node.task_id, node.generation); } @@ -180,9 +181,7 @@ class ChainScheduler : public ChainSchedulerBase { task->state = Task::State::Active; pending_tasks_.push(task_id); - for_each_child(task, [&](auto task_id) { - try_start_task(task_id); - }); + for_each_child(task, [&](auto task_id) { try_start_task(task_id); }); } template @@ -197,7 +196,7 @@ class ChainScheduler : public ChainSchedulerBase { } void inactivate_task(TaskId task_id, bool failed) { - LOG(ERROR) << "inactivate " << task_id << " " << (failed ? "failed" : "finished"); + LOG(DEBUG) << "Inactivate " << task_id << " " << (failed ? "failed" : "finished"); auto *task = tasks_.get(task_id); CHECK(task); bool was_active = task->state == Task::State::Active; @@ -238,17 +237,19 @@ class ChainScheduler : public ChainSchedulerBase { } } - std::vector to_start; + vector to_start_; + void try_start_task_later(TaskId task_id) { - LOG(ERROR) << "try start later " << task_id; - to_start.push_back(task_id); + LOG(DEBUG) << "Try to start later " << task_id; + to_start_.push_back(task_id); } + void flush_try_start_task() { - auto moved_to_start = std::move(to_start); + auto moved_to_start = std::move(to_start_); for (auto task_id : moved_to_start) { try_start_task(task_id); } - CHECK(to_start.empty()); + CHECK(to_start_.empty()); } }; @@ -311,13 +312,11 @@ template void ChainScheduler::finish_task(ChainScheduler::TaskId task_id) { auto *task = tasks_.get(task_id); CHECK(task); - CHECK(to_start.empty()); + CHECK(to_start_.empty()); inactivate_task(task_id, false); - for_each_child(task, [&](auto task_id) { - try_start_task_later(task_id); - }); + for_each_child(task, [&](auto task_id) { try_start_task_later(task_id); }); for (TaskChainInfo &task_chain_info : task->chains) { finish_chain_task(task_chain_info); @@ -329,7 +328,7 @@ void ChainScheduler::finish_task(ChainScheduler::TaskId task_id) { template void ChainScheduler::reset_task(ChainScheduler::TaskId task_id) { - CHECK(to_start.empty()); + CHECK(to_start_.empty()); auto *task = tasks_.get(task_id); CHECK(task); inactivate_task(task_id, true); @@ -355,15 +354,14 @@ StringBuilder &operator<<(StringBuilder &sb, ChainScheduler &scheduler) sb << " active_cnt=" << it.second.active_tasks; sb << " g=" << it.second.generation; sb << " :"; - it.second.chain.foreach([&](auto task_id, auto generation) { - sb << " " << *scheduler.get_task_extra(task_id) << ":" << generation; - }); + it.second.chain.foreach( + [&](auto task_id, auto generation) { sb << " " << *scheduler.get_task_extra(task_id) << ":" << generation; }); sb << "\n"; } scheduler.tasks_.for_each([&](auto id, auto &task) { sb << "Task: " << task.extra; sb << " state =" << static_cast(task.state); - for (auto& task_chain_info : task.chains) { + for (auto &task_chain_info : task.chains) { sb << " g=" << task_chain_info.chain_node.generation; if (task_chain_info.chain_info->generation != task_chain_info.chain_node.generation) { sb << " chain_g=" << task_chain_info.chain_info->generation; diff --git a/tdutils/test/ChainScheduler.cpp b/tdutils/test/ChainScheduler.cpp index 8216fb508..b7381bd28 100644 --- a/tdutils/test/ChainScheduler.cpp +++ b/tdutils/test/ChainScheduler.cpp @@ -23,9 +23,9 @@ TEST(ChainScheduler, CreateAfterActive) { using TaskId = td::ChainScheduler::TaskId; std::vector chains{1}; - auto first_task_id = scheduler.create_task( chains, 1); + auto first_task_id = scheduler.create_task(chains, 1); ASSERT_EQ(first_task_id, scheduler.start_next_task().unwrap().task_id); - auto second_task_id = scheduler.create_task( chains, 2); + auto second_task_id = scheduler.create_task(chains, 2); ASSERT_EQ(second_task_id, scheduler.start_next_task().unwrap().task_id); } @@ -35,8 +35,8 @@ TEST(ChainScheduler, RestartAfterActive) { using TaskId = td::ChainScheduler::TaskId; std::vector chains{1}; - auto first_task_id = scheduler.create_task( chains, 1); - auto second_task_id = scheduler.create_task( chains, 2); + auto first_task_id = scheduler.create_task(chains, 1); + auto second_task_id = scheduler.create_task(chains, 2); ASSERT_EQ(first_task_id, scheduler.start_next_task().unwrap().task_id); ASSERT_EQ(second_task_id, scheduler.start_next_task().unwrap().task_id); @@ -53,14 +53,14 @@ TEST(ChainScheduler, SendAfterRestart) { using TaskId = td::ChainScheduler::TaskId; std::vector chains{1}; - auto first_task_id = scheduler.create_task( chains, 1); - auto second_task_id = scheduler.create_task( chains, 2); + auto first_task_id = scheduler.create_task(chains, 1); + auto second_task_id = scheduler.create_task(chains, 2); ASSERT_EQ(first_task_id, scheduler.start_next_task().unwrap().task_id); ASSERT_EQ(second_task_id, scheduler.start_next_task().unwrap().task_id); scheduler.reset_task(first_task_id); - auto third_task_id = scheduler.create_task( chains, 3); + scheduler.create_task(chains, 3); ASSERT_EQ(first_task_id, scheduler.start_next_task().unwrap().task_id); ASSERT_TRUE(!scheduler.start_next_task()); @@ -102,18 +102,22 @@ struct Query; using QueryPtr = std::shared_ptr; using ChainId = td::ChainScheduler::ChainId; using TaskId = td::ChainScheduler::TaskId; + struct Query { int id{}; TaskId task_id{}; bool is_ok{}; bool skipped{}; - friend td::StringBuilder &operator << (td::StringBuilder &sb, const Query &q) { - return sb << "Q{" << q.id << "}"; - } }; -td::StringBuilder &operator << (td::StringBuilder &sb, const QueryPtr &query_ptr) { + +static td::StringBuilder &operator<<(td::StringBuilder &sb, const Query &q) { + return sb << "Q{" << q.id << "}"; +} + +static td::StringBuilder &operator<<(td::StringBuilder &sb, const QueryPtr &query_ptr) { return sb << *query_ptr; } + TEST(ChainScheduler, Stress) { td::Random::Xorshift128plus rnd(123); int max_query_id = 100000; @@ -184,14 +188,14 @@ TEST(ChainScheduler, Stress) { sent_cnt++; } }; - auto skip_one_query = [&]() { + auto skip_one_query = [&] { if (pending_queries.empty()) { return; } - auto it = pending_queries.begin() + rnd.fast(0, (int)pending_queries.size() - 1); + auto it = pending_queries.begin() + rnd.fast(0, static_cast(pending_queries.size()) - 1); auto task_id = *it; pending_queries.erase(it); - td::remove_if(active_queries, [&](auto &q) {return q.task_id == task_id;}); + td::remove_if(active_queries, [&](auto &q) { return q.task_id == task_id; }); auto query = *scheduler.get_task_extra(task_id); query->skipped = true;