Fix the problem of non-blocking shrinking not being enabled

This commit is contained in:
obdev 2024-12-19 12:15:01 +00:00 committed by ob-robot
parent 3421f4ac9a
commit 3b03b68833
3 changed files with 32 additions and 2 deletions

View File

@ -364,6 +364,12 @@ int ObSimpleDynamicThreadPool::init(const int64_t thread_num, const char* name,
return ret;
}
void ObSimpleDynamicThreadPool::stop()
{
IGNORE_RETURN ObSimpleThreadPoolDynamicMgr::get_instance().unbind(this);
lib::ThreadPool::stop();
}
void ObSimpleDynamicThreadPool::destroy()
{
if (min_thread_cnt_ < max_thread_cnt_) {
@ -437,7 +443,7 @@ int ObSimpleDynamicThreadPool::set_max_thread_count(int64_t max_thread_cnt)
int ObSimpleDynamicThreadPool::set_thread_count_and_try_recycle(int64_t cnt)
{
int ret = OB_SUCCESS;
ret = Threads::set_thread_count(cnt);
ret = Threads::do_set_thread_count(cnt, true/*async_recycle*/);
if (OB_SUCC(ret)) {
ret = Threads::try_thread_recycle();
}
@ -623,6 +629,7 @@ int ObSimpleThreadPoolDynamicMgr::bind(ObSimpleDynamicThreadPool *pool)
if (OB_FAIL(simple_thread_pool_list_.push_back(pool_stat))) {
COMMON_LOG(WARN, "bind simple thread pool faild", KP(pool));
} else {
pool->has_bind_ = true;
COMMON_LOG(INFO, "bind simple thread pool success", K(*pool));
}
return ret;
@ -634,6 +641,8 @@ int ObSimpleThreadPoolDynamicMgr::unbind(ObSimpleDynamicThreadPool *pool)
if (OB_UNLIKELY(NULL == pool)) {
ret = OB_INVALID_ARGUMENT;
COMMON_LOG(WARN, "unbind pool failed");
} else if (!pool->has_bind_) {
// do-nothing
} else {
SpinWLockGuard guard(simple_thread_pool_list_lock_);
int64_t idx = -1;
@ -646,6 +655,7 @@ int ObSimpleThreadPoolDynamicMgr::unbind(ObSimpleDynamicThreadPool *pool)
if ((-1 != idx) && OB_FAIL(simple_thread_pool_list_.remove(idx))) {
COMMON_LOG(WARN, "failed to remove simple_thread_pool", K(ret), K(idx), KP(pool));
} else {
pool->has_bind_ = false;
COMMON_LOG(INFO, "try to unbind simple thread pool", K(*pool), K(idx));
}
}

View File

@ -92,14 +92,16 @@ private:
class ObSimpleDynamicThreadPool
: public lib::ThreadPool
{
friend class ObSimpleThreadPoolDynamicMgr;
public:
static const int64_t MAX_THREAD_NUM = 1024;
ObSimpleDynamicThreadPool()
: min_thread_cnt_(OB_INVALID_COUNT), max_thread_cnt_(OB_INVALID_COUNT),
: has_bind_(false), min_thread_cnt_(OB_INVALID_COUNT), max_thread_cnt_(OB_INVALID_COUNT),
running_thread_cnt_(0), threads_idle_time_(0), update_threads_lock_(), ref_cnt_(0), name_("unknown"), tenant_id_(OB_SERVER_TENANT_ID)
{}
virtual ~ObSimpleDynamicThreadPool();
int init(const int64_t thread_num, const char* name, const int64_t tenant_id);
virtual void stop() override;
void destroy();
int set_adaptive_thread(int64_t min_thread_num, int64_t max_thread_num);
virtual int64_t get_queue_num() const = 0;
@ -126,6 +128,7 @@ protected:
}
int set_thread_count_and_try_recycle(int64_t cnt);
private:
bool has_bind_;
int64_t min_thread_cnt_;
int64_t max_thread_cnt_;
int64_t running_thread_cnt_;

View File

@ -11,7 +11,9 @@
*/
#include <gtest/gtest.h>
#define private public
#include "lib/thread/ob_simple_thread_pool.h"
#undef private
#include "lib/coro/testing.h"
using namespace oceanbase::common;
@ -75,6 +77,21 @@ TEST(DISABLED_TestSimpleThreadPool, Basic)
pool.destroy();
}
TEST(TestSimpleThreadPool, test_dynamic_simple_thread_pool_bind)
{
class ObTestSimpleThreadPool : public ObSimpleThreadPool {
void handle(void *) {
}
};
int ret = ObSimpleThreadPoolDynamicMgr::get_instance().init();
ASSERT_EQ(ret, OB_SUCCESS);
ObTestSimpleThreadPool pool;
ret = pool.set_adaptive_thread(1, 3);
ASSERT_EQ(ret, OB_SUCCESS);
ASSERT_TRUE(pool.has_bind_);
pool.stop();
ASSERT_FALSE(pool.has_bind_);
}
TEST(TestSimpleThreadPool, DISABLED_test_dynamic_simple_thread_pool)
{