From 8d0005bddadb601bd2097c66bc9455ee1dc2ce36 Mon Sep 17 00:00:00 2001 From: fuzhe1989 Date: Wed, 9 Mar 2022 19:58:57 +0800 Subject: [PATCH 1/4] update Signed-off-by: fuzhe1989 --- dbms/src/Common/DynamicThreadPool.cpp | 2 +- .../tests/gtest_dynamic_thread_pool.cpp | 43 +++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/dbms/src/Common/DynamicThreadPool.cpp b/dbms/src/Common/DynamicThreadPool.cpp index 87f7e8f3e26..0ad21c641b1 100644 --- a/dbms/src/Common/DynamicThreadPool.cpp +++ b/dbms/src/Common/DynamicThreadPool.cpp @@ -85,6 +85,7 @@ void executeTask(const std::unique_ptr & task) { UPDATE_CUR_AND_MAX_METRIC(tiflash_thread_count, type_active_threads_of_thdpool, type_max_active_threads_of_thdpool); task->execute(); + task.reset(); } void DynamicThreadPool::fixedWork(size_t index) @@ -124,7 +125,6 @@ void DynamicThreadPool::dynamicWork(TaskPtr initial_task) if (!node.task) // may be timeout or cancelled break; executeTask(node.task); - node.task.reset(); } alive_dynamic_threads.fetch_sub(1); } diff --git a/dbms/src/Common/tests/gtest_dynamic_thread_pool.cpp b/dbms/src/Common/tests/gtest_dynamic_thread_pool.cpp index f097cabfdb3..a850f88bcbb 100644 --- a/dbms/src/Common/tests/gtest_dynamic_thread_pool.cpp +++ b/dbms/src/Common/tests/gtest_dynamic_thread_pool.cpp @@ -3,6 +3,8 @@ namespace DB::tests { +namespace +{ class DynamicThreadPoolTest : public ::testing::Test { }; @@ -148,4 +150,45 @@ try } CATCH +struct X +{ + std::mutex * mu; + std::condition_variable * cv; + bool * destructed; + + X(std::mutex * mu_, std::condition_variable * cv_, bool * destructed_) + : mu(mu_) + , cv(cv_) + , destructed(destructed_) + {} + + ~X() + { + std::unique_lock lock(*mu); + *destructed = true; + cv->notify_all(); + } +}; + +TEST_F(DynamicThreadPoolTest, testTaskDestruct) +try +{ + std::mutex mu; + std::condition_variable cv; + bool destructed = false; + + DynamicThreadPool pool(0, std::chrono::minutes(1)); + auto tmp = std::make_shared(&mu, &cv, &destructed); + pool.schedule(true, [x = tmp] {}); + tmp.reset(); + + { + std::unique_lock lock(mu); + auto ret = cv.wait_for(lock, std::chrono::seconds(1), [&] { return destructed; }); + ASSERT_TRUE(ret); + } +} +CATCH + +} // namespace } // namespace DB::tests From 66468a78e7705ffbf9b9b0f9733924fe2796d17a Mon Sep 17 00:00:00 2001 From: Fu Zhe Date: Wed, 9 Mar 2022 23:36:24 +0800 Subject: [PATCH 2/4] Update DynamicThreadPool.cpp --- dbms/src/Common/DynamicThreadPool.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dbms/src/Common/DynamicThreadPool.cpp b/dbms/src/Common/DynamicThreadPool.cpp index 0ad21c641b1..9dcb137f115 100644 --- a/dbms/src/Common/DynamicThreadPool.cpp +++ b/dbms/src/Common/DynamicThreadPool.cpp @@ -81,12 +81,15 @@ void DynamicThreadPool::scheduledToNewDynamicThread(TaskPtr & task) t.detach(); } -void executeTask(const std::unique_ptr & task) +namespace +{ +void executeTask(TaskPtr & task) { UPDATE_CUR_AND_MAX_METRIC(tiflash_thread_count, type_active_threads_of_thdpool, type_max_active_threads_of_thdpool); task->execute(); task.reset(); } +} // namespace void DynamicThreadPool::fixedWork(size_t index) { From d5a828011f5225e492f24efaf61e45f0808082cf Mon Sep 17 00:00:00 2001 From: fuzhe1989 Date: Wed, 9 Mar 2022 23:50:35 +0800 Subject: [PATCH 3/4] update Signed-off-by: fuzhe1989 --- dbms/src/Common/DynamicThreadPool.cpp | 5 +---- dbms/src/Common/DynamicThreadPool.h | 2 ++ 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/dbms/src/Common/DynamicThreadPool.cpp b/dbms/src/Common/DynamicThreadPool.cpp index 9dcb137f115..ff13103019d 100644 --- a/dbms/src/Common/DynamicThreadPool.cpp +++ b/dbms/src/Common/DynamicThreadPool.cpp @@ -81,15 +81,12 @@ void DynamicThreadPool::scheduledToNewDynamicThread(TaskPtr & task) t.detach(); } -namespace -{ -void executeTask(TaskPtr & task) +void DynamicThreadPool::executeTask(TaskPtr & task) { UPDATE_CUR_AND_MAX_METRIC(tiflash_thread_count, type_active_threads_of_thdpool, type_max_active_threads_of_thdpool); task->execute(); task.reset(); } -} // namespace void DynamicThreadPool::fixedWork(size_t index) { diff --git a/dbms/src/Common/DynamicThreadPool.h b/dbms/src/Common/DynamicThreadPool.h index c5f39480f46..80e8cf57a62 100644 --- a/dbms/src/Common/DynamicThreadPool.h +++ b/dbms/src/Common/DynamicThreadPool.h @@ -64,6 +64,8 @@ class DynamicThreadPool void fixedWork(size_t index); void dynamicWork(TaskPtr initial_task); + void executeTask(TaskPtr & task); + const std::chrono::nanoseconds dynamic_auto_shrink_cooldown; std::vector fixed_threads; From d32371339c03a3252206a5d3359f991848ebe9df Mon Sep 17 00:00:00 2001 From: fuzhe1989 Date: Thu, 10 Mar 2022 00:00:51 +0800 Subject: [PATCH 4/4] update Signed-off-by: fuzhe1989 --- dbms/src/Common/DynamicThreadPool.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dbms/src/Common/DynamicThreadPool.h b/dbms/src/Common/DynamicThreadPool.h index 80e8cf57a62..f816385d8d2 100644 --- a/dbms/src/Common/DynamicThreadPool.h +++ b/dbms/src/Common/DynamicThreadPool.h @@ -64,7 +64,7 @@ class DynamicThreadPool void fixedWork(size_t index); void dynamicWork(TaskPtr initial_task); - void executeTask(TaskPtr & task); + static void executeTask(TaskPtr & task); const std::chrono::nanoseconds dynamic_auto_shrink_cooldown;