finetune thread_mgr interface
This commit is contained in:
		
							
								
								
									
										36
									
								
								deps/oblib/src/lib/thread/thread_define.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										36
									
								
								deps/oblib/src/lib/thread/thread_define.h
									
									
									
									
										vendored
									
									
								
							@ -11,29 +11,19 @@
 | 
				
			|||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef TG_DEF
 | 
					#ifdef TG_DEF
 | 
				
			||||||
// (tg_def_id, name, desc, scope, type, args...)
 | 
					// (tg_def_id, name, type, args...)
 | 
				
			||||||
// for test
 | 
					// for test
 | 
				
			||||||
TG_DEF(TEST1, test1, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TEST1, test1, TIMER)
 | 
				
			||||||
TG_DEF(TEST2, test2, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(1 ,1), 10)
 | 
					TG_DEF(TEST2, test2, QUEUE_THREAD, 1, 10)
 | 
				
			||||||
TG_DEF(TEST3, test3, "", TG_STATIC, DEDUP_QUEUE, ThreadCountPair(1, 1), 8, 8, 16L << 20, 16L << 20,8192, "test")
 | 
					TG_DEF(TEST3, test3, DEDUP_QUEUE, 1, 8, 8, 16L << 20, 16L << 20,8192, "test")
 | 
				
			||||||
TG_DEF(TEST4, test4, "", TG_STATIC, THREAD_POOL, ThreadCountPair(1 ,1))
 | 
					TG_DEF(TEST4, test4, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(TEST5, test5, "", TG_STATIC, ASYNC_TASK_QUEUE, ThreadCountPair(1 ,1), 16)
 | 
					TG_DEF(TEST5, test5, ASYNC_TASK_QUEUE, 1, 16)
 | 
				
			||||||
TG_DEF(TEST6, test6, "", TG_STATIC, TIMER_GROUP, ThreadCountPair(2 ,2))
 | 
					TG_DEF(TEST6, test6, MAP_QUEUE_THREAD, 2)
 | 
				
			||||||
TG_DEF(TEST7, test7, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(10 ,10), 10)
 | 
					TG_DEF(TEST7, test7, QUEUE_THREAD, 10, 10)
 | 
				
			||||||
TG_DEF(TEST8, test8, "", TG_STATIC, REENTRANT_THREAD_POOL, ThreadCountPair(1 ,1))
 | 
					TG_DEF(TEST8, test8, REENTRANT_THREAD_POOL, 1)
 | 
				
			||||||
// other
 | 
					// other
 | 
				
			||||||
TG_DEF(MEMORY_DUMP, memDump, "", TG_STATIC, THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(MEMORY_DUMP, memDump, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(SchemaRefTask, SchemaRefTask, "", TG_STATIC, DEDUP_QUEUE, ThreadCountPair(1, 1), 1024, 1024, 1L << 30, 512L << 20, common::OB_MALLOC_BIG_BLOCK_SIZE, "SchemaDedupQueu")
 | 
					TG_DEF(SchemaRefTask, SchemaRefTask, DEDUP_QUEUE, 1, 1024, 1024, 1L << 30, 512L << 20, common::OB_MALLOC_BIG_BLOCK_SIZE, "SchemaDedupQueu")
 | 
				
			||||||
TG_DEF(CONFIG_MGR, ConfigMgr, "", TG_STATIC, TIMER, 1024)
 | 
					TG_DEF(ReqMemEvict, ReqMemEvict, TIMER)
 | 
				
			||||||
TG_DEF(ReqMemEvict, ReqMemEvict, "", TG_DYNAMIC, TIMER)
 | 
					TG_DEF(replica_control, replica_control, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(IO_TUNING, IO_TUNING, "", TG_STATIC, THREAD_POOL, ThreadCountPair(1, 1))
 | 
					 | 
				
			||||||
TG_DEF(IO_SCHEDULE, IO_SCHEDULE, "", TG_DYNAMIC, THREAD_POOL, ThreadCountPair(1, 1))
 | 
					 | 
				
			||||||
TG_DEF(IO_CALLBACK, IO_CALLBACK, "", TG_DYNAMIC, THREAD_POOL, ThreadCountPair(1, 1))
 | 
					 | 
				
			||||||
TG_DEF(IO_CHANNEL, IO_CHANNEL, "", TG_DYNAMIC, THREAD_POOL, ThreadCountPair(1, 1))
 | 
					 | 
				
			||||||
TG_DEF(IO_HEALTH, IO_HEALTH, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(1 ,1), 100)
 | 
					 | 
				
			||||||
TG_DEF(IO_BENCHMARK, IO_BENCHMARK, "", TG_DYNAMIC, THREAD_POOL, ThreadCountPair(1, 1))
 | 
					 | 
				
			||||||
TG_DEF(replica_control, replica_control, "", TG_STATIC, THREAD_POOL, ThreadCountPair(1, 1))
 | 
					 | 
				
			||||||
TG_DEF(TIMEZONE_MGR, TimezoneMgr, "", TG_STATIC, TIMER)
 | 
					 | 
				
			||||||
TG_DEF(MASTER_KEY_MGR, MasterKeyMgr, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(1 ,1), 100)
 | 
					 | 
				
			||||||
TG_DEF(SRS_MGR, SrsMgr, "", TG_STATIC, TIMER, 128)
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										14
									
								
								deps/oblib/src/lib/thread/thread_mgr.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								deps/oblib/src/lib/thread/thread_mgr.cpp
									
									
									
									
										vendored
									
									
								
							@ -30,7 +30,7 @@ void set_tenant_tg_helper(TGHelper *tg_helper)
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// define TGConfig
 | 
					// define TGConfig
 | 
				
			||||||
#define TG_DEF(id, name, desc, scope, type, arg...) const ThreadCountPair TGConfig::id = ThreadCountPair(arg);
 | 
					#define TG_DEF(id, name, type, arg...) const ThreadCountPair TGConfig::id = ThreadCountPair(arg);
 | 
				
			||||||
#include "lib/thread/thread_define.h"
 | 
					#include "lib/thread/thread_define.h"
 | 
				
			||||||
#undef TG_DEF
 | 
					#undef TG_DEF
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -44,10 +44,10 @@ void __attribute__((weak)) init_create_func()
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
void lib_init_create_func()
 | 
					void lib_init_create_func()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  #define TG_DEF(id, name, desc, scope, type, args...)              \
 | 
					  #define TG_DEF(id, name, type, args...)              \
 | 
				
			||||||
    create_funcs_[TGDefIDs::id] = []() {                            \
 | 
					    create_funcs_[TGDefIDs::id] = []() {                            \
 | 
				
			||||||
      auto ret = OB_NEW(TGCLSMap<TGType::type>::CLS, SET_USE_500("tg"), args); \
 | 
					      auto ret = OB_NEW(TG_##type, SET_USE_500("tg"), args); \
 | 
				
			||||||
      ret->attr_ = {#name, desc, TGScope::scope, TGType::type};     \
 | 
					      ret->attr_ = {#name, TGType::type};     \
 | 
				
			||||||
      return ret;                                                   \
 | 
					      return ret;                                                   \
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  #include "lib/thread/thread_define.h"
 | 
					  #include "lib/thread/thread_define.h"
 | 
				
			||||||
@ -64,12 +64,6 @@ TGMgr::TGMgr()
 | 
				
			|||||||
  for (int i = 0; OB_SUCC(ret) && i < TGDefIDs::END; i++) {
 | 
					  for (int i = 0; OB_SUCC(ret) && i < TGDefIDs::END; i++) {
 | 
				
			||||||
    int tg_id = -1;
 | 
					    int tg_id = -1;
 | 
				
			||||||
    ret = create_tg(i, tg_id, 0);
 | 
					    ret = create_tg(i, tg_id, 0);
 | 
				
			||||||
    if (OB_FAIL(ret)) {
 | 
					 | 
				
			||||||
    } else if (tg_id < 0) {
 | 
					 | 
				
			||||||
      // do-nothing
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      default_tg_id_map_[i] = tg_id;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  abort_unless(OB_SUCCESS == ret);
 | 
					  abort_unless(OB_SUCCESS == ret);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										241
									
								
								deps/oblib/src/lib/thread/thread_mgr.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										241
									
								
								deps/oblib/src/lib/thread/thread_mgr.h
									
									
									
									
										vendored
									
									
								
							@ -74,21 +74,12 @@ namespace TGDefIDs {
 | 
				
			|||||||
  };
 | 
					  };
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum class TGScope
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  INVALID,
 | 
					 | 
				
			||||||
  TG_STATIC,
 | 
					 | 
				
			||||||
  TG_DYNAMIC,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
enum class TGType
 | 
					enum class TGType
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  INVALID,
 | 
					  INVALID,
 | 
				
			||||||
  REENTRANT_THREAD_POOL,
 | 
					  REENTRANT_THREAD_POOL,
 | 
				
			||||||
  THREAD_POOL,
 | 
					  THREAD_POOL,
 | 
				
			||||||
  OB_THREAD_POOL,
 | 
					 | 
				
			||||||
  TIMER,
 | 
					  TIMER,
 | 
				
			||||||
  TIMER_GROUP,
 | 
					 | 
				
			||||||
  QUEUE_THREAD,
 | 
					  QUEUE_THREAD,
 | 
				
			||||||
  DEDUP_QUEUE,
 | 
					  DEDUP_QUEUE,
 | 
				
			||||||
  ASYNC_TASK_QUEUE,
 | 
					  ASYNC_TASK_QUEUE,
 | 
				
			||||||
@ -99,10 +90,8 @@ class TGCommonAttr
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  const char *name_;
 | 
					  const char *name_;
 | 
				
			||||||
  const char *desc_;
 | 
					 | 
				
			||||||
  enum TGScope scope_;
 | 
					 | 
				
			||||||
  enum TGType type_;
 | 
					  enum TGType type_;
 | 
				
			||||||
  TO_STRING_KV(KCSTRING_(name), KCSTRING_(desc), K_(scope), K_(type));
 | 
					  TO_STRING_KV(KCSTRING_(name), K_(type));
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class ITG;
 | 
					class ITG;
 | 
				
			||||||
@ -126,7 +115,7 @@ extern void set_tenant_tg_helper(TGHelper *tg_helper);
 | 
				
			|||||||
class ITG
 | 
					class ITG
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  ITG() : tg_helper_(nullptr), tg_cgroup_(lib::ThreadCGroup::INVALID_CGROUP) {}
 | 
					  ITG() : tg_helper_(nullptr) {}
 | 
				
			||||||
  virtual ~ITG() {}
 | 
					  virtual ~ITG() {}
 | 
				
			||||||
  int64_t get_tenant_id() const
 | 
					  int64_t get_tenant_id() const
 | 
				
			||||||
  { return NULL == tg_helper_ ? common::OB_SERVER_TENANT_ID : tg_helper_->id(); }
 | 
					  { return NULL == tg_helper_ ? common::OB_SERVER_TENANT_ID : tg_helper_->id(); }
 | 
				
			||||||
@ -206,7 +195,6 @@ public:
 | 
				
			|||||||
    UNUSED(qsize);
 | 
					    UNUSED(qsize);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  TGHelper *tg_helper_;
 | 
					  TGHelper *tg_helper_;
 | 
				
			||||||
  lib::ThreadCGroup tg_cgroup_;
 | 
					 | 
				
			||||||
  TGCommonAttr attr_;
 | 
					  TGCommonAttr attr_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -229,14 +217,16 @@ public:
 | 
				
			|||||||
  TGRunnable *runnable_ = nullptr;
 | 
					  TGRunnable *runnable_ = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
template<>
 | 
					class TG_REENTRANT_THREAD_POOL : public ITG
 | 
				
			||||||
class TG<TGType::REENTRANT_THREAD_POOL> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  TG(ThreadCountPair pair)
 | 
					  TG_REENTRANT_THREAD_POOL(ThreadCountPair pair)
 | 
				
			||||||
    : thread_cnt_(pair.get_thread_cnt())
 | 
					    : thread_cnt_(pair.get_thread_cnt())
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					  TG_REENTRANT_THREAD_POOL(int64_t thread_cnt)
 | 
				
			||||||
 | 
					    : thread_cnt_(thread_cnt)
 | 
				
			||||||
 | 
					  {}
 | 
				
			||||||
 | 
					  ~TG_REENTRANT_THREAD_POOL() { destroy(); }
 | 
				
			||||||
  int thread_cnt() override { return (int)thread_cnt_; }
 | 
					  int thread_cnt() override { return (int)thread_cnt_; }
 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt)
 | 
					  int set_thread_cnt(int64_t thread_cnt)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -293,7 +283,7 @@ public:
 | 
				
			|||||||
    } else if(nullptr == th_->runnable_) {
 | 
					    } else if(nullptr == th_->runnable_) {
 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					      ret = common::OB_ERR_UNEXPECTED;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      th_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					      th_->set_run_wrapper(tg_helper_);
 | 
				
			||||||
      ret = th_->create(thread_cnt_, attr_.name_);
 | 
					      ret = th_->create(thread_cnt_, attr_.name_);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
@ -337,14 +327,16 @@ public:
 | 
				
			|||||||
  TGRunnable *runnable_ = nullptr;
 | 
					  TGRunnable *runnable_ = nullptr;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<>
 | 
					class TG_THREAD_POOL : public ITG
 | 
				
			||||||
class TG<TGType::THREAD_POOL> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  TG(ThreadCountPair pair)
 | 
					  TG_THREAD_POOL(ThreadCountPair pair)
 | 
				
			||||||
    : thread_cnt_(pair.get_thread_cnt())
 | 
					    : thread_cnt_(pair.get_thread_cnt())
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					  TG_THREAD_POOL(int64_t thread_cnt)
 | 
				
			||||||
 | 
					    : thread_cnt_(thread_cnt)
 | 
				
			||||||
 | 
					  {}
 | 
				
			||||||
 | 
					  ~TG_THREAD_POOL() { destroy(); }
 | 
				
			||||||
  int thread_cnt() override { return (int)thread_cnt_; }
 | 
					  int thread_cnt() override { return (int)thread_cnt_; }
 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt)
 | 
					  int set_thread_cnt(int64_t thread_cnt)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -379,7 +371,7 @@ public:
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      th_->runnable_->set_stop(false);
 | 
					      th_->runnable_->set_stop(false);
 | 
				
			||||||
      th_->set_thread_count(thread_cnt_);
 | 
					      th_->set_thread_count(thread_cnt_);
 | 
				
			||||||
      th_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					      th_->set_run_wrapper(tg_helper_);
 | 
				
			||||||
      ret = th_->start();
 | 
					      ret = th_->start();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
@ -432,15 +424,18 @@ public:
 | 
				
			|||||||
  TGTaskHandler *handler_ = nullptr;
 | 
					  TGTaskHandler *handler_ = nullptr;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<>
 | 
					class TG_QUEUE_THREAD : public ITG
 | 
				
			||||||
class TG<TGType::QUEUE_THREAD> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  TG(ThreadCountPair pair, const int64_t task_num_limit)
 | 
					  TG_QUEUE_THREAD(ThreadCountPair pair, const int64_t task_num_limit)
 | 
				
			||||||
    : thread_num_(pair.get_thread_cnt()),
 | 
					    : thread_num_(pair.get_thread_cnt()),
 | 
				
			||||||
      task_num_limit_(task_num_limit)
 | 
					      task_num_limit_(task_num_limit)
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					  TG_QUEUE_THREAD(int64_t thread_num, const int64_t task_num_limit)
 | 
				
			||||||
 | 
					    : thread_num_(thread_num),
 | 
				
			||||||
 | 
					      task_num_limit_(task_num_limit)
 | 
				
			||||||
 | 
					  {}
 | 
				
			||||||
 | 
					  ~TG_QUEUE_THREAD() { destroy(); }
 | 
				
			||||||
  int thread_cnt() override { return (int)thread_num_; }
 | 
					  int thread_cnt() override { return (int)thread_num_; }
 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt) override
 | 
					  int set_thread_cnt(int64_t thread_cnt) override
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -462,7 +457,7 @@ public:
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      qth_ = new (buf_) MySimpleThreadPool();
 | 
					      qth_ = new (buf_) MySimpleThreadPool();
 | 
				
			||||||
      qth_->handler_ = &handler;
 | 
					      qth_->handler_ = &handler;
 | 
				
			||||||
      qth_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					      qth_->set_run_wrapper(tg_helper_);
 | 
				
			||||||
      ret = qth_->init(thread_num_, task_num_limit_, attr_.name_, tenant_id);
 | 
					      ret = qth_->init(thread_num_, task_num_limit_, attr_.name_, tenant_id);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
@ -549,14 +544,16 @@ public:
 | 
				
			|||||||
  TGTaskHandler *handler_ = nullptr;
 | 
					  TGTaskHandler *handler_ = nullptr;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<>
 | 
					class TG_MAP_QUEUE_THREAD : public ITG
 | 
				
			||||||
class TG<TGType::MAP_QUEUE_THREAD> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  TG(ThreadCountPair pair)
 | 
					  TG_MAP_QUEUE_THREAD(ThreadCountPair pair)
 | 
				
			||||||
    : thread_num_(pair.get_thread_cnt())
 | 
					    : thread_num_(pair.get_thread_cnt())
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					  TG_MAP_QUEUE_THREAD(int64_t thread_num)
 | 
				
			||||||
 | 
					    : thread_num_(thread_num)
 | 
				
			||||||
 | 
					  {}
 | 
				
			||||||
 | 
					  ~TG_MAP_QUEUE_THREAD() { destroy(); }
 | 
				
			||||||
  int thread_cnt() override { return (int)thread_num_; }
 | 
					  int thread_cnt() override { return (int)thread_num_; }
 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt) override
 | 
					  int set_thread_cnt(int64_t thread_cnt) override
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -578,7 +575,7 @@ public:
 | 
				
			|||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      qth_ = new (buf_) MyMapQueueThreadPool();
 | 
					      qth_ = new (buf_) MyMapQueueThreadPool();
 | 
				
			||||||
      qth_->handler_ = &handler;
 | 
					      qth_->handler_ = &handler;
 | 
				
			||||||
      qth_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					      qth_->set_run_wrapper(tg_helper_);
 | 
				
			||||||
      ret = qth_->init(tenant_id, thread_num_, attr_.name_);
 | 
					      ret = qth_->init(tenant_id, thread_num_, attr_.name_);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
@ -604,6 +601,7 @@ public:
 | 
				
			|||||||
  {
 | 
					  {
 | 
				
			||||||
    if (qth_ != nullptr) {
 | 
					    if (qth_ != nullptr) {
 | 
				
			||||||
      qth_->wait();
 | 
					      qth_->wait();
 | 
				
			||||||
 | 
					      destroy();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  void destroy()
 | 
					  void destroy()
 | 
				
			||||||
@ -631,11 +629,10 @@ private:
 | 
				
			|||||||
  int64_t thread_num_;
 | 
					  int64_t thread_num_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<>
 | 
					class TG_DEDUP_QUEUE : public ITG
 | 
				
			||||||
class TG<TGType::DEDUP_QUEUE> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  TG(ThreadCountPair pair,
 | 
					  TG_DEDUP_QUEUE(ThreadCountPair pair,
 | 
				
			||||||
     const int64_t queue_size = ObDedupQueue::TASK_QUEUE_SIZE,
 | 
					     const int64_t queue_size = ObDedupQueue::TASK_QUEUE_SIZE,
 | 
				
			||||||
     const int64_t task_map_size = ObDedupQueue::TASK_MAP_SIZE,
 | 
					     const int64_t task_map_size = ObDedupQueue::TASK_MAP_SIZE,
 | 
				
			||||||
     const int64_t total_mem_limit = ObDedupQueue::TOTAL_LIMIT,
 | 
					     const int64_t total_mem_limit = ObDedupQueue::TOTAL_LIMIT,
 | 
				
			||||||
@ -650,7 +647,22 @@ public:
 | 
				
			|||||||
       page_size_(page_size),
 | 
					       page_size_(page_size),
 | 
				
			||||||
       label_(label)
 | 
					       label_(label)
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					  TG_DEDUP_QUEUE(int64_t thread_num,
 | 
				
			||||||
 | 
					     const int64_t queue_size = ObDedupQueue::TASK_QUEUE_SIZE,
 | 
				
			||||||
 | 
					     const int64_t task_map_size = ObDedupQueue::TASK_MAP_SIZE,
 | 
				
			||||||
 | 
					     const int64_t total_mem_limit = ObDedupQueue::TOTAL_LIMIT,
 | 
				
			||||||
 | 
					     const int64_t hold_mem_limit = ObDedupQueue::HOLD_LIMIT,
 | 
				
			||||||
 | 
					     const int64_t page_size = ObDedupQueue::PAGE_SIZE,
 | 
				
			||||||
 | 
					     const char *label = nullptr)
 | 
				
			||||||
 | 
					    :  thread_num_(thread_num),
 | 
				
			||||||
 | 
					       queue_size_(queue_size),
 | 
				
			||||||
 | 
					       task_map_size_(task_map_size),
 | 
				
			||||||
 | 
					       total_mem_limit_(total_mem_limit),
 | 
				
			||||||
 | 
					       hold_mem_limit_(hold_mem_limit),
 | 
				
			||||||
 | 
					       page_size_(page_size),
 | 
				
			||||||
 | 
					       label_(label)
 | 
				
			||||||
 | 
					  {}
 | 
				
			||||||
 | 
					  ~TG_DEDUP_QUEUE() { destroy(); }
 | 
				
			||||||
  int thread_cnt() override { return (int)thread_num_; }
 | 
					  int thread_cnt() override { return (int)thread_num_; }
 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt) override
 | 
					  int set_thread_cnt(int64_t thread_cnt) override
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -670,7 +682,7 @@ public:
 | 
				
			|||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					      ret = common::OB_ERR_UNEXPECTED;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      qth_ = new (buf_) common::ObDedupQueue();
 | 
					      qth_ = new (buf_) common::ObDedupQueue();
 | 
				
			||||||
      qth_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					      qth_->set_run_wrapper(tg_helper_);
 | 
				
			||||||
      if (OB_FAIL(qth_->init(thread_num_,
 | 
					      if (OB_FAIL(qth_->init(thread_num_,
 | 
				
			||||||
                             attr_.name_,
 | 
					                             attr_.name_,
 | 
				
			||||||
                             queue_size_,
 | 
					                             queue_size_,
 | 
				
			||||||
@ -734,14 +746,13 @@ private:
 | 
				
			|||||||
  const char *label_;
 | 
					  const char *label_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<>
 | 
					class TG_TIMER : public ITG
 | 
				
			||||||
class TG<TGType::TIMER> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  TG(int64_t max_task_num = 32)
 | 
					  TG_TIMER(int64_t max_task_num = 32)
 | 
				
			||||||
    : max_task_num_(max_task_num)
 | 
					    : max_task_num_(max_task_num)
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					  ~TG_TIMER() { destroy(); }
 | 
				
			||||||
  int thread_cnt() override { return 1; }
 | 
					  int thread_cnt() override { return 1; }
 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt) override
 | 
					  int set_thread_cnt(int64_t thread_cnt) override
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -756,7 +767,7 @@ public:
 | 
				
			|||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					      ret = common::OB_ERR_UNEXPECTED;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      timer_ = new (buf_) common::ObTimer(max_task_num_);
 | 
					      timer_ = new (buf_) common::ObTimer(max_task_num_);
 | 
				
			||||||
      timer_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					      timer_->set_run_wrapper(tg_helper_);
 | 
				
			||||||
      if (OB_FAIL(timer_->init(attr_.name_,
 | 
					      if (OB_FAIL(timer_->init(attr_.name_,
 | 
				
			||||||
                               ObMemAttr(get_tenant_id(), "TGTimer")))) {
 | 
					                               ObMemAttr(get_tenant_id(), "TGTimer")))) {
 | 
				
			||||||
        OB_LOG(WARN, "init failed", K(ret));
 | 
					        OB_LOG(WARN, "init failed", K(ret));
 | 
				
			||||||
@ -832,15 +843,18 @@ private:
 | 
				
			|||||||
  int64_t max_task_num_;
 | 
					  int64_t max_task_num_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<>
 | 
					class TG_ASYNC_TASK_QUEUE : public ITG
 | 
				
			||||||
class TG<TGType::ASYNC_TASK_QUEUE> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  TG(lib::ThreadCountPair pair, const int64_t queue_size)
 | 
					  TG_ASYNC_TASK_QUEUE(lib::ThreadCountPair pair, const int64_t queue_size)
 | 
				
			||||||
    : thread_cnt_(pair.get_thread_cnt()),
 | 
					    : thread_cnt_(pair.get_thread_cnt()),
 | 
				
			||||||
      queue_size_(queue_size)
 | 
					      queue_size_(queue_size)
 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					  TG_ASYNC_TASK_QUEUE(int64_t thread_cnt, const int64_t queue_size)
 | 
				
			||||||
 | 
					    : thread_cnt_(thread_cnt),
 | 
				
			||||||
 | 
					      queue_size_(queue_size)
 | 
				
			||||||
 | 
					  {}
 | 
				
			||||||
 | 
					  ~TG_ASYNC_TASK_QUEUE() { destroy(); }
 | 
				
			||||||
  int thread_cnt() override { return (int)thread_cnt_; }
 | 
					  int thread_cnt() override { return (int)thread_cnt_; }
 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt) override
 | 
					  int set_thread_cnt(int64_t thread_cnt) override
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
@ -860,7 +874,7 @@ public:
 | 
				
			|||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					      ret = common::OB_ERR_UNEXPECTED;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      qth_ = new (buf_) share::ObAsyncTaskQueue();
 | 
					      qth_ = new (buf_) share::ObAsyncTaskQueue();
 | 
				
			||||||
      qth_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					      qth_->set_run_wrapper(tg_helper_);
 | 
				
			||||||
      if (OB_FAIL(qth_->init(thread_cnt_,
 | 
					      if (OB_FAIL(qth_->init(thread_cnt_,
 | 
				
			||||||
                             queue_size_,
 | 
					                             queue_size_,
 | 
				
			||||||
                             attr_.name_))) {
 | 
					                             attr_.name_))) {
 | 
				
			||||||
@ -908,123 +922,8 @@ private:
 | 
				
			|||||||
  int64_t queue_size_;
 | 
					  int64_t queue_size_;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<>
 | 
					 | 
				
			||||||
class TG<TGType::TIMER_GROUP> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  static constexpr int MAX_CNT = 32;
 | 
					 | 
				
			||||||
  using TimerType = TG<TGType::TIMER>;
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
  TG(ThreadCountPair pair)
 | 
					 | 
				
			||||||
    : cnt_(pair.get_thread_cnt())
 | 
					 | 
				
			||||||
  {}
 | 
					 | 
				
			||||||
  ~TG() { destroy(); }
 | 
					 | 
				
			||||||
  int thread_cnt() override { return (int)cnt_; }
 | 
					 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    UNUSED(thread_cnt);
 | 
					 | 
				
			||||||
    int ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int start() override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    int ret = common::OB_SUCCESS;
 | 
					 | 
				
			||||||
    if (is_inited_) {
 | 
					 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      if (cnt_ >= MAX_CNT) {
 | 
					 | 
				
			||||||
        ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      for (int i = 0; OB_SUCC(ret) && i < cnt_; i++) {
 | 
					 | 
				
			||||||
        auto *tmp = new (buf_ + sizeof(TimerType) * i) TimerType();
 | 
					 | 
				
			||||||
        tmp->attr_ = attr_;
 | 
					 | 
				
			||||||
        if (OB_FAIL(tmp->start())) {
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
          timers_[i] = tmp;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      is_inited_ = true;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void stop() override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (is_inited_) {
 | 
					 | 
				
			||||||
      for (int i = 0; i < cnt_; i++) {
 | 
					 | 
				
			||||||
        if (timers_[i] != nullptr) {
 | 
					 | 
				
			||||||
          timers_[i]->stop();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void wait() override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (is_inited_) {
 | 
					 | 
				
			||||||
      for (int i = 0; i < cnt_; i++) {
 | 
					 | 
				
			||||||
        if (timers_[i] != nullptr) {
 | 
					 | 
				
			||||||
          timers_[i]->wait();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      destroy();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int schedule(int idx, common::ObTimerTask &task, const int64_t delay,
 | 
					 | 
				
			||||||
               bool repeate = false, bool immediate = false) override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    int ret = common::OB_SUCCESS;
 | 
					 | 
				
			||||||
    if (!is_inited_) {
 | 
					 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    } else if (idx >= cnt_) {
 | 
					 | 
				
			||||||
      ret = common::OB_INVALID_ARGUMENT;
 | 
					 | 
				
			||||||
    } else if (OB_ISNULL(timers_[idx])) {
 | 
					 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      ret = timers_[idx]->schedule(task, delay, repeate, immediate);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void destroy()
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (is_inited_) {
 | 
					 | 
				
			||||||
      for (int i = 0; i < cnt_; i++) {
 | 
					 | 
				
			||||||
        if (timers_[i] != nullptr) {
 | 
					 | 
				
			||||||
          timers_[i]->~TimerType();
 | 
					 | 
				
			||||||
          timers_[i] = nullptr;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      is_inited_ = false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
  char buf_[sizeof(TimerType) * MAX_CNT];
 | 
					 | 
				
			||||||
  TimerType *timers_[MAX_CNT] = {nullptr};
 | 
					 | 
				
			||||||
  const int64_t cnt_ = 0;
 | 
					 | 
				
			||||||
  bool is_inited_ = false;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<enum TGType type>
 | 
					 | 
				
			||||||
class TGCLSMap;
 | 
					 | 
				
			||||||
#define BIND_TG_CLS(type, CLS_)    \
 | 
					 | 
				
			||||||
  namespace lib                    \
 | 
					 | 
				
			||||||
  {                                \
 | 
					 | 
				
			||||||
    template<>                     \
 | 
					 | 
				
			||||||
    class TGCLSMap<type>           \
 | 
					 | 
				
			||||||
    {                              \
 | 
					 | 
				
			||||||
    public:                        \
 | 
					 | 
				
			||||||
      using CLS = CLS_;            \
 | 
					 | 
				
			||||||
    };                             \
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
} // end of namespace lib
 | 
					} // end of namespace lib
 | 
				
			||||||
 | 
					
 | 
				
			||||||
BIND_TG_CLS(TGType::REENTRANT_THREAD_POOL, TG<TGType::REENTRANT_THREAD_POOL>);
 | 
					 | 
				
			||||||
BIND_TG_CLS(TGType::THREAD_POOL, TG<TGType::THREAD_POOL>);
 | 
					 | 
				
			||||||
BIND_TG_CLS(TGType::QUEUE_THREAD, TG<TGType::QUEUE_THREAD>);
 | 
					 | 
				
			||||||
BIND_TG_CLS(TGType::DEDUP_QUEUE, TG<TGType::DEDUP_QUEUE>);
 | 
					 | 
				
			||||||
BIND_TG_CLS(TGType::TIMER, TG<TGType::TIMER>);
 | 
					 | 
				
			||||||
BIND_TG_CLS(TGType::TIMER_GROUP, TG<TGType::TIMER_GROUP>);
 | 
					 | 
				
			||||||
BIND_TG_CLS(TGType::ASYNC_TASK_QUEUE, TG<TGType::ASYNC_TASK_QUEUE>);
 | 
					 | 
				
			||||||
BIND_TG_CLS(TGType::MAP_QUEUE_THREAD, TG<TGType::MAP_QUEUE_THREAD>);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace lib {
 | 
					namespace lib {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class TGMgr
 | 
					class TGMgr
 | 
				
			||||||
@ -1071,8 +970,7 @@ public:
 | 
				
			|||||||
  // tenant isolation
 | 
					  // tenant isolation
 | 
				
			||||||
  int create_tg_tenant(int tg_def_id,
 | 
					  int create_tg_tenant(int tg_def_id,
 | 
				
			||||||
                       int &tg_id,
 | 
					                       int &tg_id,
 | 
				
			||||||
                       int64_t qsize = 0,
 | 
					                       int64_t qsize = 0)
 | 
				
			||||||
                       lib::ThreadCGroup cgroup = lib::ThreadCGroup::FRONT_CGROUP)
 | 
					 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    tg_id = -1;
 | 
					    tg_id = -1;
 | 
				
			||||||
    int ret = common::OB_SUCCESS;
 | 
					    int ret = common::OB_SUCCESS;
 | 
				
			||||||
@ -1097,7 +995,6 @@ public:
 | 
				
			|||||||
        OB_LOG(WARN, "create tg tenant but tenant tg helper is null", K(tg_def_id), K(tg_id));
 | 
					        OB_LOG(WARN, "create tg tenant but tenant tg helper is null", K(tg_def_id), K(tg_id));
 | 
				
			||||||
      } else {
 | 
					      } else {
 | 
				
			||||||
        tg->tg_helper_ = tg_helper;
 | 
					        tg->tg_helper_ = tg_helper;
 | 
				
			||||||
        tg->tg_cgroup_ = cgroup;
 | 
					 | 
				
			||||||
        tg_helper->tg_create_cb(tg_id);
 | 
					        tg_helper->tg_create_cb(tg_id);
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      tg->set_queue_size(qsize);
 | 
					      tg->set_queue_size(qsize);
 | 
				
			||||||
@ -1118,7 +1015,6 @@ private:
 | 
				
			|||||||
  char bs_buf_[ABitSet::buf_len(MAX_ID)];
 | 
					  char bs_buf_[ABitSet::buf_len(MAX_ID)];
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
  ITG *tgs_[MAX_ID] = {nullptr};
 | 
					  ITG *tgs_[MAX_ID] = {nullptr};
 | 
				
			||||||
  int default_tg_id_map_[TGDefIDs::END] = {-1};
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template<typename Func, bool return_void=false>
 | 
					template<typename Func, bool return_void=false>
 | 
				
			||||||
@ -1149,8 +1045,7 @@ public:
 | 
				
			|||||||
      OB_LOG(ERROR, "invalid tg id");                \
 | 
					      OB_LOG(ERROR, "invalid tg id");                \
 | 
				
			||||||
    } else {                                         \
 | 
					    } else {                                         \
 | 
				
			||||||
      lib::ITG *tg =                                 \
 | 
					      lib::ITG *tg =                                 \
 | 
				
			||||||
        TG_MGR.tgs_[static_cast<int>(tg_id) < static_cast<int>(lib::TGDefIDs::END) ? \
 | 
					        TG_MGR.tgs_[tg_id];                          \
 | 
				
			||||||
        TG_MGR.default_tg_id_map_[tg_id] : tg_id];   \
 | 
					 | 
				
			||||||
      if (OB_ISNULL(tg)) {                           \
 | 
					      if (OB_ISNULL(tg)) {                           \
 | 
				
			||||||
        ret = common::OB_ERR_UNEXPECTED;             \
 | 
					        ret = common::OB_ERR_UNEXPECTED;             \
 | 
				
			||||||
      } else {                                       \
 | 
					      } else {                                       \
 | 
				
			||||||
@ -1221,7 +1116,7 @@ public:
 | 
				
			|||||||
      tg_type = tg->attr_.type_;                                                                        \
 | 
					      tg_type = tg->attr_.type_;                                                                        \
 | 
				
			||||||
    }                                                                                                   \
 | 
					    }                                                                                                   \
 | 
				
			||||||
    if (TGType::REENTRANT_THREAD_POOL == tg_type) {                                                     \
 | 
					    if (TGType::REENTRANT_THREAD_POOL == tg_type) {                                                     \
 | 
				
			||||||
      TG<TGType::REENTRANT_THREAD_POOL>* tmp_tg = static_cast<TG<TGType::REENTRANT_THREAD_POOL>*>(tg); \
 | 
					      TG_REENTRANT_THREAD_POOL* tmp_tg = static_cast<TG_REENTRANT_THREAD_POOL*>(tg); \
 | 
				
			||||||
      ret = tmp_tg->logical_start();                                                                    \
 | 
					      ret = tmp_tg->logical_start();                                                                    \
 | 
				
			||||||
    } else {                                                                                            \
 | 
					    } else {                                                                                            \
 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;                                                                  \
 | 
					      ret = common::OB_ERR_UNEXPECTED;                                                                  \
 | 
				
			||||||
@ -1239,7 +1134,7 @@ public:
 | 
				
			|||||||
      tg_type = tg->attr_.type_;                                                                        \
 | 
					      tg_type = tg->attr_.type_;                                                                        \
 | 
				
			||||||
    }                                                                                                   \
 | 
					    }                                                                                                   \
 | 
				
			||||||
    if (TGType::REENTRANT_THREAD_POOL == tg_type) {                                                     \
 | 
					    if (TGType::REENTRANT_THREAD_POOL == tg_type) {                                                     \
 | 
				
			||||||
      TG<TGType::REENTRANT_THREAD_POOL>* tmp_tg = static_cast<TG<TGType::REENTRANT_THREAD_POOL>*>(tg); \
 | 
					      TG_REENTRANT_THREAD_POOL* tmp_tg = static_cast<TG_REENTRANT_THREAD_POOL*>(tg); \
 | 
				
			||||||
      tmp_tg->logical_stop();                                                                           \
 | 
					      tmp_tg->logical_stop();                                                                           \
 | 
				
			||||||
    } else {                                                                                            \
 | 
					    } else {                                                                                            \
 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;                                                                  \
 | 
					      ret = common::OB_ERR_UNEXPECTED;                                                                  \
 | 
				
			||||||
@ -1256,7 +1151,7 @@ public:
 | 
				
			|||||||
      tg_type = tg->attr_.type_;                                                                        \
 | 
					      tg_type = tg->attr_.type_;                                                                        \
 | 
				
			||||||
    }                                                                                                   \
 | 
					    }                                                                                                   \
 | 
				
			||||||
    if (TGType::REENTRANT_THREAD_POOL == tg_type) {                                                     \
 | 
					    if (TGType::REENTRANT_THREAD_POOL == tg_type) {                                                     \
 | 
				
			||||||
      TG<TGType::REENTRANT_THREAD_POOL>* tmp_tg = static_cast<TG<TGType::REENTRANT_THREAD_POOL>*>(tg); \
 | 
					      TG_REENTRANT_THREAD_POOL* tmp_tg = static_cast<TG_REENTRANT_THREAD_POOL*>(tg); \
 | 
				
			||||||
      tmp_tg->logical_wait();                                                                           \
 | 
					      tmp_tg->logical_wait();                                                                           \
 | 
				
			||||||
    } else {                                                                                            \
 | 
					    } else {                                                                                            \
 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;                                                                  \
 | 
					      ret = common::OB_ERR_UNEXPECTED;                                                                  \
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										17
									
								
								deps/oblib/src/lib/thread/threads.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								deps/oblib/src/lib/thread/threads.h
									
									
									
									
										vendored
									
									
								
							@ -25,13 +25,6 @@ extern int64_t global_thread_stack_size;
 | 
				
			|||||||
namespace oceanbase {
 | 
					namespace oceanbase {
 | 
				
			||||||
namespace lib {
 | 
					namespace lib {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
enum ThreadCGroup
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
  INVALID_CGROUP = 0,
 | 
					 | 
				
			||||||
  FRONT_CGROUP = 1,
 | 
					 | 
				
			||||||
  BACK_CGROUP = 2,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class Threads;
 | 
					class Threads;
 | 
				
			||||||
class IRunWrapper
 | 
					class IRunWrapper
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
@ -59,8 +52,7 @@ public:
 | 
				
			|||||||
        threads_(nullptr),
 | 
					        threads_(nullptr),
 | 
				
			||||||
        stack_size_(global_thread_stack_size),
 | 
					        stack_size_(global_thread_stack_size),
 | 
				
			||||||
        stop_(true),
 | 
					        stop_(true),
 | 
				
			||||||
        run_wrapper_(nullptr),
 | 
					        run_wrapper_(nullptr)
 | 
				
			||||||
        cgroup_(INVALID_CGROUP)
 | 
					 | 
				
			||||||
  {}
 | 
					  {}
 | 
				
			||||||
  virtual ~Threads();
 | 
					  virtual ~Threads();
 | 
				
			||||||
  static IRunWrapper *&get_expect_run_wrapper();
 | 
					  static IRunWrapper *&get_expect_run_wrapper();
 | 
				
			||||||
@ -87,10 +79,9 @@ public:
 | 
				
			|||||||
  int init();
 | 
					  int init();
 | 
				
			||||||
  // IRunWrapper 用于创建多租户线程时指定租户上下文
 | 
					  // IRunWrapper 用于创建多租户线程时指定租户上下文
 | 
				
			||||||
  // cgroup_ctrl 和IRunWrapper配合使用,实现多租户线程的CPU隔离
 | 
					  // cgroup_ctrl 和IRunWrapper配合使用,实现多租户线程的CPU隔离
 | 
				
			||||||
  void set_run_wrapper(IRunWrapper *run_wrapper, ThreadCGroup cgroup = ThreadCGroup::FRONT_CGROUP)
 | 
					  void set_run_wrapper(IRunWrapper *run_wrapper)
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    run_wrapper_ = run_wrapper;
 | 
					    run_wrapper_ = run_wrapper;
 | 
				
			||||||
    cgroup_ = cgroup;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  virtual int start();
 | 
					  virtual int start();
 | 
				
			||||||
  virtual void stop();
 | 
					  virtual void stop();
 | 
				
			||||||
@ -105,7 +96,6 @@ public:
 | 
				
			|||||||
    int ret = OB_SUCCESS;
 | 
					    int ret = OB_SUCCESS;
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  ThreadCGroup get_cgroup() { return cgroup_; }
 | 
					 | 
				
			||||||
  virtual bool has_set_stop() const
 | 
					  virtual bool has_set_stop() const
 | 
				
			||||||
  {
 | 
					  {
 | 
				
			||||||
    IGNORE_RETURN lib::Thread::update_loop_ts();
 | 
					    IGNORE_RETURN lib::Thread::update_loop_ts();
 | 
				
			||||||
@ -143,9 +133,6 @@ private:
 | 
				
			|||||||
  common::SpinRWLock lock_ __attribute__((__aligned__(16)));
 | 
					  common::SpinRWLock lock_ __attribute__((__aligned__(16)));
 | 
				
			||||||
  // tenant ctx
 | 
					  // tenant ctx
 | 
				
			||||||
  IRunWrapper *run_wrapper_;
 | 
					  IRunWrapper *run_wrapper_;
 | 
				
			||||||
  // thread cgroups
 | 
					 | 
				
			||||||
  ThreadCGroup cgroup_;
 | 
					 | 
				
			||||||
  //
 | 
					 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
using ThreadPool = Threads;
 | 
					using ThreadPool = Threads;
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										51
									
								
								deps/oblib/unittest/lib/thread/test_tg_mgr.cpp
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										51
									
								
								deps/oblib/unittest/lib/thread/test_tg_mgr.cpp
									
									
									
									
										vendored
									
									
								
							@ -271,46 +271,49 @@ TEST(TG, async_task_queue)
 | 
				
			|||||||
  ASSERT_FALSE(TG_EXIST(tg_id));
 | 
					  ASSERT_FALSE(TG_EXIST(tg_id));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
TEST(TG, timer_group)
 | 
					class MapQueueThreadHandler : public TGTaskHandler
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					public:
 | 
				
			||||||
 | 
					  void handle(void *task) override
 | 
				
			||||||
 | 
					  {}
 | 
				
			||||||
 | 
					  void handle(void *task, volatile bool &is_stopped) override
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    UNUSED(task);
 | 
				
			||||||
 | 
					    UNUSED(is_stopped);
 | 
				
			||||||
 | 
					    ++handle_count_;
 | 
				
			||||||
 | 
					    ::usleep(50000);
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int64_t handle_count_ = 0;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(TG, map_queue_thread)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int tg_id = TGDefIDs::TEST6;
 | 
					  int tg_id = TGDefIDs::TEST6;
 | 
				
			||||||
  TestTimerTask tasks[2];
 | 
					  MapQueueThreadHandler handler;
 | 
				
			||||||
  // start
 | 
					  // start
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_SET_HANDLER(tg_id, handler));
 | 
				
			||||||
  ASSERT_EQ(OB_SUCCESS, TG_START(tg_id));
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_START(tg_id));
 | 
				
			||||||
  for (int i = 0; i < ARRAYSIZEOF(tasks); i++) {
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_PUSH_TASK(tg_id, &tg_id, 0));
 | 
				
			||||||
    ASSERT_EQ(OB_SUCCESS, TG_SCHEDULE(tg_id, i, tasks[i], 0, true));
 | 
					  ::usleep(50000);
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  ::usleep(40000);
 | 
					 | 
				
			||||||
  for (int i = 0; i < ARRAYSIZEOF(tasks); i++) {
 | 
					 | 
				
			||||||
    ASSERT_TRUE(tasks[i].running_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  ::usleep(60000);
 | 
					 | 
				
			||||||
  for (int i = 0; i < ARRAYSIZEOF(tasks); i++) {
 | 
					 | 
				
			||||||
    ASSERT_EQ(1, tasks[i].task_run_count_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  ASSERT_EQ(OB_SUCCESS, TG_STOP_R(tg_id));
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_STOP_R(tg_id));
 | 
				
			||||||
  ASSERT_EQ(OB_SUCCESS, TG_WAIT_R(tg_id));
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_WAIT_R(tg_id));
 | 
				
			||||||
 | 
					  ASSERT_EQ(1, handler.handle_count_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // restart
 | 
					  // restart
 | 
				
			||||||
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_SET_HANDLER(tg_id, handler));
 | 
				
			||||||
  ASSERT_EQ(OB_SUCCESS, TG_START(tg_id));
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_START(tg_id));
 | 
				
			||||||
  for (int i = 0; i < ARRAYSIZEOF(tasks); i++) {
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_PUSH_TASK(tg_id, &tg_id, 1));
 | 
				
			||||||
    ASSERT_EQ(OB_SUCCESS, TG_SCHEDULE(tg_id, i, tasks[i], 0, true));
 | 
					  ::usleep(50000);
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  ::usleep(40000);
 | 
					 | 
				
			||||||
  for (int i = 0; i < ARRAYSIZEOF(tasks); i++) {
 | 
					 | 
				
			||||||
    ASSERT_TRUE(tasks[i].running_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  ::usleep(60000);
 | 
					 | 
				
			||||||
  for (int i = 0; i < ARRAYSIZEOF(tasks); i++) {
 | 
					 | 
				
			||||||
    ASSERT_EQ(2, tasks[i].task_run_count_);
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  ASSERT_EQ(OB_SUCCESS, TG_STOP_R(tg_id));
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_STOP_R(tg_id));
 | 
				
			||||||
  ASSERT_EQ(OB_SUCCESS, TG_WAIT_R(tg_id));
 | 
					  ASSERT_EQ(OB_SUCCESS, TG_WAIT_R(tg_id));
 | 
				
			||||||
 | 
					  ASSERT_EQ(2, handler.handle_count_);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  ASSERT_TRUE(TG_EXIST(tg_id));
 | 
					  ASSERT_TRUE(TG_EXIST(tg_id));
 | 
				
			||||||
  TG_DESTROY(tg_id);
 | 
					  TG_DESTROY(tg_id);
 | 
				
			||||||
  ASSERT_FALSE(TG_EXIST(tg_id));
 | 
					  ASSERT_FALSE(TG_EXIST(tg_id));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int main(int argc, char *argv[])
 | 
					int main(int argc, char *argv[])
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | 
					  oceanbase::common::ObLogger::get_logger().set_log_level("INFO");
 | 
				
			||||||
 | 
				
			|||||||
@ -142,7 +142,7 @@ void ObArchiveFetcher::destroy()
 | 
				
			|||||||
int ObArchiveFetcher::start()
 | 
					int ObArchiveFetcher::start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObThreadPool::set_run_wrapper(MTL_CTX(), lib::ThreadCGroup::BACK_CGROUP);
 | 
					  ObThreadPool::set_run_wrapper(MTL_CTX());
 | 
				
			||||||
  if (OB_UNLIKELY(! inited_)) {
 | 
					  if (OB_UNLIKELY(! inited_)) {
 | 
				
			||||||
    ARCHIVE_LOG(ERROR, "ObArchiveFetcher not init");
 | 
					    ARCHIVE_LOG(ERROR, "ObArchiveFetcher not init");
 | 
				
			||||||
    ret = OB_NOT_INIT;
 | 
					    ret = OB_NOT_INIT;
 | 
				
			||||||
 | 
				
			|||||||
@ -116,7 +116,7 @@ void ObArchiveSender::destroy()
 | 
				
			|||||||
int ObArchiveSender::start()
 | 
					int ObArchiveSender::start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObThreadPool::set_run_wrapper(MTL_CTX(), lib::ThreadCGroup::BACK_CGROUP);
 | 
					  ObThreadPool::set_run_wrapper(MTL_CTX());
 | 
				
			||||||
  if (OB_UNLIKELY(! inited_)) {
 | 
					  if (OB_UNLIKELY(! inited_)) {
 | 
				
			||||||
    ret = OB_NOT_INIT;
 | 
					    ret = OB_NOT_INIT;
 | 
				
			||||||
    ARCHIVE_LOG(INFO, "ObArchiveSender has not been initialized", KR(ret));
 | 
					    ARCHIVE_LOG(INFO, "ObArchiveSender has not been initialized", KR(ret));
 | 
				
			||||||
 | 
				
			|||||||
@ -90,7 +90,7 @@ void ObArchiveSequencer::destroy()
 | 
				
			|||||||
int ObArchiveSequencer::start()
 | 
					int ObArchiveSequencer::start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObThreadPool::set_run_wrapper(MTL_CTX(), lib::ThreadCGroup::BACK_CGROUP);
 | 
					  ObThreadPool::set_run_wrapper(MTL_CTX());
 | 
				
			||||||
  if (OB_UNLIKELY(! inited_)) {
 | 
					  if (OB_UNLIKELY(! inited_)) {
 | 
				
			||||||
    ARCHIVE_LOG(ERROR, "ObArchiveSequencer not init");
 | 
					    ARCHIVE_LOG(ERROR, "ObArchiveSequencer not init");
 | 
				
			||||||
    ret = OB_NOT_INIT;
 | 
					    ret = OB_NOT_INIT;
 | 
				
			||||||
 | 
				
			|||||||
@ -109,7 +109,7 @@ int ObArchiveService::init(logservice::ObLogService *log_service,
 | 
				
			|||||||
int ObArchiveService::start()
 | 
					int ObArchiveService::start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObThreadPool::set_run_wrapper(MTL_CTX(), lib::ThreadCGroup::BACK_CGROUP);
 | 
					  ObThreadPool::set_run_wrapper(MTL_CTX());
 | 
				
			||||||
  if (OB_UNLIKELY(! inited_)) {
 | 
					  if (OB_UNLIKELY(! inited_)) {
 | 
				
			||||||
    ret = OB_NOT_INIT;
 | 
					    ret = OB_NOT_INIT;
 | 
				
			||||||
    ARCHIVE_LOG(ERROR, "archive service not init", K(ret));
 | 
					    ARCHIVE_LOG(ERROR, "archive service not init", K(ret));
 | 
				
			||||||
 | 
				
			|||||||
@ -73,7 +73,7 @@ void ObArchiveTimer::destroy()
 | 
				
			|||||||
int ObArchiveTimer::start()
 | 
					int ObArchiveTimer::start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObThreadPool::set_run_wrapper(MTL_CTX(), lib::ThreadCGroup::BACK_CGROUP);
 | 
					  ObThreadPool::set_run_wrapper(MTL_CTX());
 | 
				
			||||||
  if (OB_UNLIKELY(! inited_)) {
 | 
					  if (OB_UNLIKELY(! inited_)) {
 | 
				
			||||||
    ret = OB_NOT_INIT;
 | 
					    ret = OB_NOT_INIT;
 | 
				
			||||||
    ARCHIVE_LOG(ERROR, "ObArchiveTimer not init", K(ret), K(inited_), K(tenant_id_));
 | 
					    ARCHIVE_LOG(ERROR, "ObArchiveTimer not init", K(ret), K(inited_), K(tenant_id_));
 | 
				
			||||||
 | 
				
			|||||||
@ -183,7 +183,7 @@ int ObArchiveLSMgr::init(const uint64_t tenant_id,
 | 
				
			|||||||
int ObArchiveLSMgr::start()
 | 
					int ObArchiveLSMgr::start()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObThreadPool::set_run_wrapper(MTL_CTX(), lib::ThreadCGroup::BACK_CGROUP);
 | 
					  ObThreadPool::set_run_wrapper(MTL_CTX());
 | 
				
			||||||
  if (OB_UNLIKELY(! inited_)) {
 | 
					  if (OB_UNLIKELY(! inited_)) {
 | 
				
			||||||
    ARCHIVE_LOG(ERROR, "ObArchiveLSMgr not init");
 | 
					    ARCHIVE_LOG(ERROR, "ObArchiveLSMgr not init");
 | 
				
			||||||
    ret = OB_NOT_INIT;
 | 
					    ret = OB_NOT_INIT;
 | 
				
			||||||
 | 
				
			|||||||
@ -14,128 +14,138 @@
 | 
				
			|||||||
#define GET_THREAD_NUM_BY_NPROCESSORS(factor) (sysconf(_SC_NPROCESSORS_ONLN) / (factor) > 0 ? sysconf(_SC_NPROCESSORS_ONLN) / (factor) : 1)
 | 
					#define GET_THREAD_NUM_BY_NPROCESSORS(factor) (sysconf(_SC_NPROCESSORS_ONLN) / (factor) > 0 ? sysconf(_SC_NPROCESSORS_ONLN) / (factor) : 1)
 | 
				
			||||||
#define GET_THREAD_NUM_BY_NPROCESSORS_WITH_LIMIT(factor, limit) (sysconf(_SC_NPROCESSORS_ONLN) / (factor) > 0 ? min(sysconf(_SC_NPROCESSORS_ONLN) / (factor), limit) : 1)
 | 
					#define GET_THREAD_NUM_BY_NPROCESSORS_WITH_LIMIT(factor, limit) (sysconf(_SC_NPROCESSORS_ONLN) / (factor) > 0 ? min(sysconf(_SC_NPROCESSORS_ONLN) / (factor), limit) : 1)
 | 
				
			||||||
#define GET_MYSQL_THREAD_COUNT(default_cnt) (GCONF.sql_login_thread_count ? GCONF.sql_login_thread_count : (default_cnt))
 | 
					#define GET_MYSQL_THREAD_COUNT(default_cnt) (GCONF.sql_login_thread_count ? GCONF.sql_login_thread_count : (default_cnt))
 | 
				
			||||||
TG_DEF(TEST_OB_TH, testObTh, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1 ,1))
 | 
					TG_DEF(TEST_OB_TH, testObTh, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(COMMON_THREAD_POOL, ComTh, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1 ,1))
 | 
					TG_DEF(COMMON_THREAD_POOL, ComTh, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(COMMON_QUEUE_THREAD, ComQueueTh, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(1 ,1), 100)
 | 
					TG_DEF(COMMON_QUEUE_THREAD, ComQueueTh, QUEUE_THREAD, 1, 100)
 | 
				
			||||||
TG_DEF(COMMON_TIMER_THREAD, ComTimerTh, "", TG_STATIC, TIMER)
 | 
					TG_DEF(COMMON_TIMER_THREAD, ComTimerTh, TIMER)
 | 
				
			||||||
TG_DEF(Blacklist, Blacklist, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(Blacklist, Blacklist, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(PartSerMigRetryQt, PartSerMigRetryQt, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(PartSerMigRetryQt, PartSerMigRetryQt, THREAD_POOL, 1)
 | 
				
			||||||
// TG_DEF(PartSerCb, PartSerCb, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(storage::ObCallbackQueueThread::QUEUE_THREAD_NUM, storage::ObCallbackQueueThread::MINI_MODE_QUEUE_THREAD_NUM),
 | 
					// TG_DEF(PartSerCb, PartSerCb, QUEUE_THREAD, ThreadCountPair(storage::ObCallbackQueueThread::QUEUE_THREAD_NUM, storage::ObCallbackQueueThread::MINI_MODE_QUEUE_THREAD_NUM),
 | 
				
			||||||
//       (!lib::is_mini_mode() ? OB_MAX_PARTITION_NUM_PER_SERVER : OB_MINI_MODE_MAX_PARTITION_NUM_PER_SERVER) * 2)
 | 
					//       (!lib::is_mini_mode() ? OB_MAX_PARTITION_NUM_PER_SERVER : OB_MINI_MODE_MAX_PARTITION_NUM_PER_SERVER) * 2)
 | 
				
			||||||
// TG_DEF(PartSerLargeCb, PartSerLargeCb, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(storage::ObCallbackQueueThread::QUEUE_THREAD_NUM, storage::ObCallbackQueueThread::MINI_MODE_QUEUE_THREAD_NUM),
 | 
					// TG_DEF(PartSerLargeCb, PartSerLargeCb, QUEUE_THREAD, ThreadCountPair(storage::ObCallbackQueueThread::QUEUE_THREAD_NUM, storage::ObCallbackQueueThread::MINI_MODE_QUEUE_THREAD_NUM),
 | 
				
			||||||
//       (!lib::is_mini_mode() ? OB_MAX_PARTITION_NUM_PER_SERVER : OB_MINI_MODE_MAX_PARTITION_NUM_PER_SERVER) * 2)
 | 
					//       (!lib::is_mini_mode() ? OB_MAX_PARTITION_NUM_PER_SERVER : OB_MINI_MODE_MAX_PARTITION_NUM_PER_SERVER) * 2)
 | 
				
			||||||
TG_DEF(ReplayEngine, ReplayEngine, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(sysconf(_SC_NPROCESSORS_ONLN), 2),
 | 
					TG_DEF(ReplayEngine, ReplayEngine, QUEUE_THREAD, ThreadCountPair(sysconf(_SC_NPROCESSORS_ONLN), 2),
 | 
				
			||||||
       !lib::is_mini_mode() ? (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MAX_PARTITION_NUM_PER_SERVER : (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MINI_MODE_MAX_PARTITION_NUM_PER_SERVER)
 | 
					       !lib::is_mini_mode() ? (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MAX_PARTITION_NUM_PER_SERVER : (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MINI_MODE_MAX_PARTITION_NUM_PER_SERVER)
 | 
				
			||||||
TG_DEF(TransMigrate, TransMigrate, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS(24), 1), 10000)
 | 
					TG_DEF(TransMigrate, TransMigrate, QUEUE_THREAD, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS(24), 1), 10000)
 | 
				
			||||||
TG_DEF(StandbyTimestampService, StandbyTimestampService, "", TG_DYNAMIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(StandbyTimestampService, StandbyTimestampService, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(WeakReadService, WeakRdSrv, "", TG_DYNAMIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(WeakReadService, WeakRdSrv, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(TransTaskWork, TransTaskWork, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS(12), 1), transaction::ObThreadLocalTransCtx::MAX_BIG_TRANS_TASK)
 | 
					TG_DEF(TransTaskWork, TransTaskWork, QUEUE_THREAD, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS(12), 1), transaction::ObThreadLocalTransCtx::MAX_BIG_TRANS_TASK)
 | 
				
			||||||
TG_DEF(DDLTaskExecutor3, DDLTaskExecutor3, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(8, 2))
 | 
					TG_DEF(DDLTaskExecutor3, DDLTaskExecutor3, THREAD_POOL, ThreadCountPair(8, 2))
 | 
				
			||||||
TG_DEF(TSWorker, TSWorker, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS(12), 1), transaction::ObTsWorker::MAX_TASK_NUM)
 | 
					TG_DEF(TSWorker, TSWorker, QUEUE_THREAD, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS(12), 1), transaction::ObTsWorker::MAX_TASK_NUM)
 | 
				
			||||||
TG_DEF(BRPC, BRPC, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(obrpc::ObBatchRpc::MAX_THREAD_COUNT, obrpc::ObBatchRpc::MINI_MODE_THREAD_COUNT))
 | 
					TG_DEF(BRPC, BRPC, THREAD_POOL, ThreadCountPair(obrpc::ObBatchRpc::MAX_THREAD_COUNT, obrpc::ObBatchRpc::MINI_MODE_THREAD_COUNT))
 | 
				
			||||||
TG_DEF(RLMGR, RLMGR, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(RLMGR, RLMGR, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(LeaseQueueTh, LeaseQueueTh, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(observer::ObSrvDeliver::LEASE_TASK_THREAD_CNT, observer::ObSrvDeliver::MINI_MODE_LEASE_TASK_THREAD_CNT))
 | 
					TG_DEF(LeaseQueueTh, LeaseQueueTh, THREAD_POOL, ThreadCountPair(observer::ObSrvDeliver::LEASE_TASK_THREAD_CNT, observer::ObSrvDeliver::MINI_MODE_LEASE_TASK_THREAD_CNT))
 | 
				
			||||||
TG_DEF(DDLQueueTh, DDLQueueTh, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(observer::ObSrvDeliver::DDL_TASK_THREAD_CNT, observer::ObSrvDeliver::DDL_TASK_THREAD_CNT))
 | 
					TG_DEF(DDLQueueTh, DDLQueueTh, THREAD_POOL, ThreadCountPair(observer::ObSrvDeliver::DDL_TASK_THREAD_CNT, observer::ObSrvDeliver::DDL_TASK_THREAD_CNT))
 | 
				
			||||||
TG_DEF(MysqlQueueTh, MysqlQueueTh, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(GET_MYSQL_THREAD_COUNT(observer::ObSrvDeliver::MYSQL_TASK_THREAD_CNT), GET_MYSQL_THREAD_COUNT(observer::ObSrvDeliver::MINI_MODE_MYSQL_TASK_THREAD_CNT)))
 | 
					TG_DEF(MysqlQueueTh, MysqlQueueTh, THREAD_POOL, ThreadCountPair(GET_MYSQL_THREAD_COUNT(observer::ObSrvDeliver::MYSQL_TASK_THREAD_CNT), GET_MYSQL_THREAD_COUNT(observer::ObSrvDeliver::MINI_MODE_MYSQL_TASK_THREAD_CNT)))
 | 
				
			||||||
TG_DEF(DDLPQueueTh, DDLPQueueTh, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS_WITH_LIMIT(2, 24), 2))
 | 
					TG_DEF(DDLPQueueTh, DDLPQueueTh, THREAD_POOL, ThreadCountPair(GET_THREAD_NUM_BY_NPROCESSORS_WITH_LIMIT(2, 24), 2))
 | 
				
			||||||
TG_DEF(DiagnoseQueueTh, DiagnoseQueueTh, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(observer::ObSrvDeliver::MYSQL_DIAG_TASK_THREAD_CNT, observer::ObSrvDeliver::MINI_MODE_MYSQL_DIAG_TASK_THREAD_CNT))
 | 
					TG_DEF(DiagnoseQueueTh, DiagnoseQueueTh, THREAD_POOL, ThreadCountPair(observer::ObSrvDeliver::MYSQL_DIAG_TASK_THREAD_CNT, observer::ObSrvDeliver::MINI_MODE_MYSQL_DIAG_TASK_THREAD_CNT))
 | 
				
			||||||
TG_DEF(DdlBuild, DdlBuild, "", TG_STATIC, ASYNC_TASK_QUEUE, ThreadCountPair(16, 1), 4 << 10)
 | 
					TG_DEF(DdlBuild, DdlBuild, ASYNC_TASK_QUEUE, ThreadCountPair(16, 1), 4 << 10)
 | 
				
			||||||
TG_DEF(LSService, LSService, "", TG_STATIC, REENTRANT_THREAD_POOL, ThreadCountPair(2 ,2))
 | 
					TG_DEF(LSService, LSService, REENTRANT_THREAD_POOL, 2)
 | 
				
			||||||
TG_DEF(ObCreateStandbyFromNetActor, ObCreateStandbyFromNetActor, "", TG_STATIC, REENTRANT_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(ObCreateStandbyFromNetActor, ObCreateStandbyFromNetActor, REENTRANT_THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(SimpleLSService, SimpleLSService, "", TG_STATIC, REENTRANT_THREAD_POOL, ThreadCountPair(1 ,1))
 | 
					TG_DEF(SimpleLSService, SimpleLSService, REENTRANT_THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(IntermResGC, IntermResGC, "", TG_STATIC, TIMER)
 | 
					TG_DEF(IntermResGC, IntermResGC, TIMER)
 | 
				
			||||||
TG_DEF(ServerGTimer, ServerGTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ServerGTimer, ServerGTimer, TIMER)
 | 
				
			||||||
TG_DEF(FreezeTimer, FreezeTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(FreezeTimer, FreezeTimer, TIMER)
 | 
				
			||||||
TG_DEF(SqlMemTimer, SqlMemTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(SqlMemTimer, SqlMemTimer, TIMER)
 | 
				
			||||||
TG_DEF(ServerTracerTimer, ServerTracerTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ServerTracerTimer, ServerTracerTimer, TIMER)
 | 
				
			||||||
TG_DEF(RSqlPool, RSqlPool, "", TG_STATIC, TIMER)
 | 
					TG_DEF(RSqlPool, RSqlPool, TIMER)
 | 
				
			||||||
TG_DEF(KVCacheWash, KVCacheWash, "", TG_STATIC, TIMER)
 | 
					TG_DEF(KVCacheWash, KVCacheWash, TIMER)
 | 
				
			||||||
TG_DEF(KVCacheRep, KVCacheRep, "", TG_STATIC, TIMER)
 | 
					TG_DEF(KVCacheRep, KVCacheRep, TIMER)
 | 
				
			||||||
TG_DEF(ObHeartbeat, ObHeartbeat, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ObHeartbeat, ObHeartbeat, TIMER)
 | 
				
			||||||
TG_DEF(PlanCacheEvict, PlanCacheEvict, "", TG_DYNAMIC, TIMER)
 | 
					TG_DEF(PlanCacheEvict, PlanCacheEvict, TIMER)
 | 
				
			||||||
TG_DEF(TabletStatRpt, TabletStatRpt, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TabletStatRpt, TabletStatRpt, TIMER)
 | 
				
			||||||
TG_DEF(PsCacheEvict, PsCacheEvict, "", TG_DYNAMIC, TIMER)
 | 
					TG_DEF(PsCacheEvict, PsCacheEvict, TIMER)
 | 
				
			||||||
TG_DEF(MergeLoop, MergeLoop, "", TG_STATIC, TIMER)
 | 
					TG_DEF(MergeLoop, MergeLoop, TIMER)
 | 
				
			||||||
TG_DEF(SSTableGC, SSTableGC, "", TG_STATIC, TIMER)
 | 
					TG_DEF(SSTableGC, SSTableGC, TIMER)
 | 
				
			||||||
TG_DEF(MediumLoop, MediumLoop, "", TG_STATIC, TIMER)
 | 
					TG_DEF(MediumLoop, MediumLoop, TIMER)
 | 
				
			||||||
TG_DEF(WriteCkpt, WriteCkpt, "", TG_STATIC, TIMER)
 | 
					TG_DEF(WriteCkpt, WriteCkpt, TIMER)
 | 
				
			||||||
TG_DEF(EXTLogWash, EXTLogWash, "", TG_STATIC, TIMER)
 | 
					TG_DEF(EXTLogWash, EXTLogWash, TIMER)
 | 
				
			||||||
TG_DEF(LineCache, LineCache, "", TG_STATIC, TIMER)
 | 
					TG_DEF(LineCache, LineCache, TIMER)
 | 
				
			||||||
TG_DEF(LocalityReload, LocalityReload, "", TG_STATIC, TIMER)
 | 
					TG_DEF(LocalityReload, LocalityReload, TIMER)
 | 
				
			||||||
TG_DEF(MemstoreGC, MemstoreGC, "", TG_STATIC, TIMER)
 | 
					TG_DEF(MemstoreGC, MemstoreGC, TIMER)
 | 
				
			||||||
TG_DEF(DiskUseReport, DiskUseReport, "", TG_STATIC, TIMER)
 | 
					TG_DEF(DiskUseReport, DiskUseReport, TIMER)
 | 
				
			||||||
TG_DEF(CLOGReqMinor, CLOGReqMinor, "", TG_STATIC, TIMER)
 | 
					TG_DEF(CLOGReqMinor, CLOGReqMinor, TIMER)
 | 
				
			||||||
TG_DEF(PGArchiveLog, PGArchiveLog, "", TG_STATIC, TIMER)
 | 
					TG_DEF(PGArchiveLog, PGArchiveLog, TIMER)
 | 
				
			||||||
TG_DEF(CKPTLogRep, CKPTLogRep, "", TG_STATIC, TIMER)
 | 
					TG_DEF(CKPTLogRep, CKPTLogRep, TIMER)
 | 
				
			||||||
TG_DEF(RebuildRetry, RebuildRetry, "", TG_STATIC, TIMER)
 | 
					TG_DEF(RebuildRetry, RebuildRetry, TIMER)
 | 
				
			||||||
TG_DEF(TableMgrGC, TableMgrGC, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TableMgrGC, TableMgrGC, TIMER)
 | 
				
			||||||
TG_DEF(IndexSche, IndexSche, "", TG_STATIC, TIMER)
 | 
					TG_DEF(IndexSche, IndexSche, TIMER)
 | 
				
			||||||
TG_DEF(FreInfoReload, FreInfoReload, "", TG_DYNAMIC, TIMER)
 | 
					TG_DEF(FreInfoReload, FreInfoReload, TIMER)
 | 
				
			||||||
TG_DEF(HAGtsMgr, HAGtsMgr, "", TG_STATIC, TIMER)
 | 
					TG_DEF(HAGtsMgr, HAGtsMgr, TIMER)
 | 
				
			||||||
TG_DEF(HAGtsHB, HAGtsHB, "", TG_STATIC, TIMER)
 | 
					TG_DEF(HAGtsHB, HAGtsHB, TIMER)
 | 
				
			||||||
TG_DEF(RebuildTask, RebuildTask, "", TG_STATIC, TIMER)
 | 
					TG_DEF(RebuildTask, RebuildTask, TIMER)
 | 
				
			||||||
TG_DEF(LogDiskMon, LogDiskMon, "", TG_DYNAMIC, TIMER)
 | 
					TG_DEF(LogDiskMon, LogDiskMon, TIMER)
 | 
				
			||||||
TG_DEF(ILOGFlush, ILOGFlush, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ILOGFlush, ILOGFlush, TIMER)
 | 
				
			||||||
TG_DEF(ILOGPurge, ILOGPurge, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ILOGPurge, ILOGPurge, TIMER)
 | 
				
			||||||
TG_DEF(RLogClrCache, RLogClrCache, "", TG_STATIC, TIMER)
 | 
					TG_DEF(RLogClrCache, RLogClrCache, TIMER)
 | 
				
			||||||
TG_DEF(TableStatRpt, TableStatRpt, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TableStatRpt, TableStatRpt, TIMER)
 | 
				
			||||||
TG_DEF(MacroMetaMgr, MacroMetaMgr, "", TG_STATIC, TIMER)
 | 
					TG_DEF(MacroMetaMgr, MacroMetaMgr, TIMER)
 | 
				
			||||||
TG_DEF(StoreFileGC, StoreFileGC, "", TG_STATIC, TIMER)
 | 
					TG_DEF(StoreFileGC, StoreFileGC, TIMER)
 | 
				
			||||||
TG_DEF(LeaseHB, LeaseHB, "", TG_STATIC, TIMER)
 | 
					TG_DEF(LeaseHB, LeaseHB, TIMER)
 | 
				
			||||||
TG_DEF(ClusterTimer, ClusterTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ClusterTimer, ClusterTimer, TIMER)
 | 
				
			||||||
TG_DEF(MergeTimer, MergeTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(MergeTimer, MergeTimer, TIMER)
 | 
				
			||||||
TG_DEF(CFC, CFC, "", TG_STATIC, TIMER)
 | 
					TG_DEF(CFC, CFC, TIMER)
 | 
				
			||||||
TG_DEF(CCDF, CCDF, "", TG_STATIC, TIMER)
 | 
					TG_DEF(CCDF, CCDF, TIMER)
 | 
				
			||||||
TG_DEF(LogMysqlPool, LogMysqlPool, "", TG_STATIC, TIMER)
 | 
					TG_DEF(LogMysqlPool, LogMysqlPool, TIMER)
 | 
				
			||||||
TG_DEF(TblCliSqlPool, TblCliSqlPool, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TblCliSqlPool, TblCliSqlPool, TIMER)
 | 
				
			||||||
TG_DEF(QueryExecCtxGC, QueryExecCtxGC, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(QueryExecCtxGC, QueryExecCtxGC, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(DtlDfc, DtlDfc, "", TG_STATIC, TIMER)
 | 
					TG_DEF(DtlDfc, DtlDfc, TIMER)
 | 
				
			||||||
TG_DEF(LogIOTaskCbThreadPool, LogIOCb, "", TG_STATIC, QUEUE_THREAD,
 | 
					TG_DEF(LogIOTaskCbThreadPool, LogIOCb, QUEUE_THREAD,
 | 
				
			||||||
       ThreadCountPair(palf::LogIOTaskCbThreadPool::THREAD_NUM,
 | 
					       ThreadCountPair(palf::LogIOTaskCbThreadPool::THREAD_NUM,
 | 
				
			||||||
       palf::LogIOTaskCbThreadPool::MINI_MODE_THREAD_NUM),
 | 
					       palf::LogIOTaskCbThreadPool::MINI_MODE_THREAD_NUM),
 | 
				
			||||||
       palf::LogIOTaskCbThreadPool::MAX_LOG_IO_CB_TASK_NUM)
 | 
					       palf::LogIOTaskCbThreadPool::MAX_LOG_IO_CB_TASK_NUM)
 | 
				
			||||||
TG_DEF(ReplayService, ReplaySrv, "", TG_DYNAMIC, QUEUE_THREAD, ThreadCountPair(1, 1),
 | 
					TG_DEF(ReplayService, ReplaySrv, QUEUE_THREAD, 1,
 | 
				
			||||||
       !lib::is_mini_mode() ? (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
					       !lib::is_mini_mode() ? (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : (common::REPLAY_TASK_QUEUE_SIZE + 1) * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
				
			||||||
TG_DEF(LogRouteService, LogRouteSrv, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(1, 1),
 | 
					TG_DEF(LogRouteService, LogRouteSrv, QUEUE_THREAD, 1,
 | 
				
			||||||
       !lib::is_mini_mode() ? (common::MAX_SERVER_COUNT) * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : (common::MAX_SERVER_COUNT) * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
					       !lib::is_mini_mode() ? (common::MAX_SERVER_COUNT) * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : (common::MAX_SERVER_COUNT) * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
				
			||||||
TG_DEF(LogRouterTimer, LogRouterTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(LogRouterTimer, LogRouterTimer, TIMER)
 | 
				
			||||||
TG_DEF(LogFetcherLSWorker, LSWorker, "", TG_STATIC, MAP_QUEUE_THREAD, ThreadCountPair(4, 1))
 | 
					TG_DEF(LogFetcherLSWorker, LSWorker, MAP_QUEUE_THREAD, ThreadCountPair(4, 1))
 | 
				
			||||||
TG_DEF(LogFetcherIdlePool, LSIdlePool, "", TG_STATIC, MAP_QUEUE_THREAD, ThreadCountPair(1, 1))
 | 
					TG_DEF(LogFetcherIdlePool, LSIdlePool, MAP_QUEUE_THREAD, 1)
 | 
				
			||||||
TG_DEF(LogFetcherDeadPool, LSDeadPool, "", TG_STATIC, MAP_QUEUE_THREAD, ThreadCountPair(1, 1))
 | 
					TG_DEF(LogFetcherDeadPool, LSDeadPool, MAP_QUEUE_THREAD, 1)
 | 
				
			||||||
TG_DEF(LogFetcherTimer, LSTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(LogFetcherTimer, LSTimer, TIMER)
 | 
				
			||||||
TG_DEF(PalfBlockGC, PalfGC, "", TG_DYNAMIC, TIMER)
 | 
					TG_DEF(PalfBlockGC, PalfGC, TIMER)
 | 
				
			||||||
TG_DEF(LSFreeze, LSFreeze, "", TG_STATIC, QUEUE_THREAD, ThreadCountPair(storage::ObLSFreezeThread::QUEUE_THREAD_NUM, storage::ObLSFreezeThread::MINI_MODE_QUEUE_THREAD_NUM),
 | 
					TG_DEF(LSFreeze, LSFreeze, QUEUE_THREAD, ThreadCountPair(storage::ObLSFreezeThread::QUEUE_THREAD_NUM, storage::ObLSFreezeThread::MINI_MODE_QUEUE_THREAD_NUM),
 | 
				
			||||||
       storage::ObLSFreezeThread::MAX_FREE_TASK_NUM)
 | 
					       storage::ObLSFreezeThread::MAX_FREE_TASK_NUM)
 | 
				
			||||||
TG_DEF(LSFetchLogEngine, FetchLog, "", TG_DYNAMIC, QUEUE_THREAD,
 | 
					TG_DEF(LSFetchLogEngine, FetchLog, QUEUE_THREAD,
 | 
				
			||||||
       ThreadCountPair(palf::FetchLogEngine::FETCH_LOG_THREAD_COUNT, palf::FetchLogEngine::MINI_MODE_FETCH_LOG_THREAD_COUNT),
 | 
					       ThreadCountPair(palf::FetchLogEngine::FETCH_LOG_THREAD_COUNT, palf::FetchLogEngine::MINI_MODE_FETCH_LOG_THREAD_COUNT),
 | 
				
			||||||
       !lib::is_mini_mode() ? palf::FetchLogEngine::FETCH_LOG_TASK_MAX_COUNT_PER_LS * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : palf::FetchLogEngine::FETCH_LOG_TASK_MAX_COUNT_PER_LS * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
					       !lib::is_mini_mode() ? palf::FetchLogEngine::FETCH_LOG_TASK_MAX_COUNT_PER_LS * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : palf::FetchLogEngine::FETCH_LOG_TASK_MAX_COUNT_PER_LS * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
				
			||||||
TG_DEF(DagScheduler, DagScheduler, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(DagScheduler, DagScheduler, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(DagWorker, DagWorker, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(DagWorker, DagWorker, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(RCService, RCSrv, "", TG_DYNAMIC, QUEUE_THREAD,
 | 
					TG_DEF(RCService, RCSrv, QUEUE_THREAD,
 | 
				
			||||||
       ThreadCountPair(logservice::ObRoleChangeService::MAX_THREAD_NUM,
 | 
					       ThreadCountPair(logservice::ObRoleChangeService::MAX_THREAD_NUM,
 | 
				
			||||||
       logservice::ObRoleChangeService::MAX_THREAD_NUM),
 | 
					       logservice::ObRoleChangeService::MAX_THREAD_NUM),
 | 
				
			||||||
       logservice::ObRoleChangeService::MAX_RC_EVENT_TASK)
 | 
					       logservice::ObRoleChangeService::MAX_RC_EVENT_TASK)
 | 
				
			||||||
TG_DEF(ApplyService, ApplySrv, "", TG_DYNAMIC, QUEUE_THREAD, ThreadCountPair(1, 1),
 | 
					TG_DEF(ApplyService, ApplySrv, QUEUE_THREAD, 1,
 | 
				
			||||||
       !lib::is_mini_mode() ? (common::APPLY_TASK_QUEUE_SIZE + 1) * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : (common::APPLY_TASK_QUEUE_SIZE + 1) * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
					       !lib::is_mini_mode() ? (common::APPLY_TASK_QUEUE_SIZE + 1) * OB_MAX_LS_NUM_PER_TENANT_PER_SERVER : (common::APPLY_TASK_QUEUE_SIZE + 1) * OB_MINI_MODE_MAX_LS_NUM_PER_TENANT_PER_SERVER)
 | 
				
			||||||
TG_DEF(GlobalCtxTimer, GlobalCtxTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(GlobalCtxTimer, GlobalCtxTimer, TIMER)
 | 
				
			||||||
TG_DEF(StorageLogWriter, StorageLogWriter, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(StorageLogWriter, StorageLogWriter, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(ReplayProcessStat, ReplayProcessStat, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ReplayProcessStat, ReplayProcessStat, TIMER)
 | 
				
			||||||
TG_DEF(ActiveSessHist, ActiveSessHist, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ActiveSessHist, ActiveSessHist, TIMER)
 | 
				
			||||||
TG_DEF(CTASCleanUpTimer, CTASCleanUpTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(CTASCleanUpTimer, CTASCleanUpTimer, TIMER)
 | 
				
			||||||
TG_DEF(DDLScanTask, DDLScanTask, "", TG_STATIC, TIMER)
 | 
					TG_DEF(DDLScanTask, DDLScanTask, TIMER)
 | 
				
			||||||
TG_DEF(TenantLSMetaChecker, LSMetaCh, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TenantLSMetaChecker, LSMetaCh, TIMER)
 | 
				
			||||||
TG_DEF(TenantTabletMetaChecker, TbMetaCh, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TenantTabletMetaChecker, TbMetaCh, TIMER)
 | 
				
			||||||
TG_DEF(ServerMetaChecker, SvrMetaCh, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ServerMetaChecker, SvrMetaCh, TIMER)
 | 
				
			||||||
TG_DEF(ArbGCSTh, ArbGCTimerP, "", TG_STATIC, TIMER)
 | 
					TG_DEF(ArbGCSTh, ArbGCTimerP, TIMER)
 | 
				
			||||||
TG_DEF(DataDictTimer, DataDictTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(DataDictTimer, DataDictTimer, TIMER)
 | 
				
			||||||
TG_DEF(CDCService, CDCSrv, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(CDCService, CDCSrv, THREAD_POOL, 1)
 | 
				
			||||||
TG_DEF(LogUpdater, LogUpdater, "", TG_STATIC, TIMER)
 | 
					TG_DEF(LogUpdater, LogUpdater, TIMER)
 | 
				
			||||||
TG_DEF(HeartBeatCheckTask, HeartBeatCheckTask, "", TG_STATIC, TIMER)
 | 
					TG_DEF(HeartBeatCheckTask, HeartBeatCheckTask, TIMER)
 | 
				
			||||||
TG_DEF(RedefHeartBeatTask, RedefHeartBeatTask, "", TG_STATIC, TIMER)
 | 
					TG_DEF(RedefHeartBeatTask, RedefHeartBeatTask, TIMER)
 | 
				
			||||||
TG_DEF(MemDumpTimer, MemDumpTimer, "", TG_STATIC, TIMER)
 | 
					TG_DEF(MemDumpTimer, MemDumpTimer, TIMER)
 | 
				
			||||||
TG_DEF(SSTableDefragment, SSTableDefragment, "", TG_STATIC, TIMER)
 | 
					TG_DEF(SSTableDefragment, SSTableDefragment, TIMER)
 | 
				
			||||||
TG_DEF(TenantMetaMemMgr, TenantMetaMemMgr, "", TG_STATIC, TIMER)
 | 
					TG_DEF(TenantMetaMemMgr, TenantMetaMemMgr, TIMER)
 | 
				
			||||||
TG_DEF(IngressService, IngressService, "", TG_STATIC, TIMER)
 | 
					TG_DEF(IngressService, IngressService, TIMER)
 | 
				
			||||||
TG_DEF(HeartbeatService, HeartbeatService, "", TG_STATIC, REENTRANT_THREAD_POOL, ThreadCountPair(2, 2))
 | 
					TG_DEF(HeartbeatService, HeartbeatService, REENTRANT_THREAD_POOL, 2)
 | 
				
			||||||
TG_DEF(DetectManager, DetectManager, "", TG_STATIC, OB_THREAD_POOL, ThreadCountPair(1, 1))
 | 
					TG_DEF(DetectManager, DetectManager, THREAD_POOL, 1)
 | 
				
			||||||
 | 
					TG_DEF(CONFIG_MGR, ConfigMgr, TIMER, 1024)
 | 
				
			||||||
 | 
					TG_DEF(IO_TUNING, IO_TUNING, THREAD_POOL, 1)
 | 
				
			||||||
 | 
					TG_DEF(IO_SCHEDULE, IO_SCHEDULE, THREAD_POOL, 1)
 | 
				
			||||||
 | 
					TG_DEF(IO_CALLBACK, IO_CALLBACK, THREAD_POOL, 1)
 | 
				
			||||||
 | 
					TG_DEF(IO_CHANNEL, IO_CHANNEL, THREAD_POOL, 1)
 | 
				
			||||||
 | 
					TG_DEF(IO_HEALTH, IO_HEALTH, QUEUE_THREAD, 1, 100)
 | 
				
			||||||
 | 
					TG_DEF(IO_BENCHMARK, IO_BENCHMARK, THREAD_POOL, 1)
 | 
				
			||||||
 | 
					TG_DEF(TIMEZONE_MGR, TimezoneMgr, TIMER)
 | 
				
			||||||
 | 
					TG_DEF(MASTER_KEY_MGR, MasterKeyMgr, QUEUE_THREAD, 1, 100)
 | 
				
			||||||
 | 
					TG_DEF(SRS_MGR, SrsMgr, TIMER, 128)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
				
			|||||||
@ -31,10 +31,10 @@ namespace share
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
void ob_init_create_func()
 | 
					void ob_init_create_func()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  #define TG_DEF(id, name, desc, scope, type, args...)                 \
 | 
					  #define TG_DEF(id, name, type, args...)                 \
 | 
				
			||||||
    lib::create_funcs_[lib::TGDefIDs::id] = []() {                     \
 | 
					    lib::create_funcs_[lib::TGDefIDs::id] = []() {                     \
 | 
				
			||||||
      auto ret = OB_NEW(TGCLSMap<TGType::type>::CLS, SET_USE_500("tg"), args); \
 | 
					      auto ret = OB_NEW(TG_##type, SET_USE_500("tg"), args); \
 | 
				
			||||||
      ret->attr_ = {#name, desc, TGScope::scope, TGType::type};        \
 | 
					      ret->attr_ = {#name, TGType::type};        \
 | 
				
			||||||
      return ret;                                                      \
 | 
					      return ret;                                                      \
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
  #include "share/ob_thread_define.h"
 | 
					  #include "share/ob_thread_define.h"
 | 
				
			||||||
 | 
				
			|||||||
@ -30,103 +30,6 @@ enum OBTGDefIDEnum
 | 
				
			|||||||
};
 | 
					};
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
} // end of namespace lib
 | 
					} // end of namespace lib
 | 
				
			||||||
 | 
					 | 
				
			||||||
namespace share
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
using lib::TGType;
 | 
					 | 
				
			||||||
using lib::ITG;
 | 
					 | 
				
			||||||
template<enum TGType type>
 | 
					 | 
				
			||||||
class ObTG;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class MyObThreadPool : public share::ObThreadPool
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
  void run1() override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    runnable_->set_thread_idx(get_thread_idx());
 | 
					 | 
				
			||||||
    runnable_->run1();
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  lib::TGRunnable *runnable_ = nullptr;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template<>
 | 
					 | 
				
			||||||
class ObTG<TGType::OB_THREAD_POOL> : public ITG
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
public:
 | 
					 | 
				
			||||||
  ObTG(lib::ThreadCountPair pair)
 | 
					 | 
				
			||||||
    : thread_cnt_(pair.get_thread_cnt())
 | 
					 | 
				
			||||||
  {}
 | 
					 | 
				
			||||||
  ~ObTG() { destroy(); }
 | 
					 | 
				
			||||||
  int thread_cnt() override { return (int)thread_cnt_; }
 | 
					 | 
				
			||||||
  int set_thread_cnt(int64_t thread_cnt) override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    int ret = common::OB_SUCCESS;
 | 
					 | 
				
			||||||
    if (th_ == nullptr) {
 | 
					 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      thread_cnt_ = thread_cnt;
 | 
					 | 
				
			||||||
      th_->set_thread_count(thread_cnt_);
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int set_runnable(lib::TGRunnable &runnable)
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    int ret = common::OB_SUCCESS;
 | 
					 | 
				
			||||||
    if (th_ != nullptr) {
 | 
					 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      th_ = new (buf_) MyObThreadPool();
 | 
					 | 
				
			||||||
      th_->runnable_= &runnable;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  int start() override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    int ret = common::OB_SUCCESS;
 | 
					 | 
				
			||||||
    if (nullptr == th_) {
 | 
					 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    } else if(nullptr == th_->runnable_) {
 | 
					 | 
				
			||||||
      ret = common::OB_ERR_UNEXPECTED;
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      th_->runnable_->set_stop(false);
 | 
					 | 
				
			||||||
      th_->set_thread_count(thread_cnt_);
 | 
					 | 
				
			||||||
      th_->set_run_wrapper(tg_helper_, tg_cgroup_);
 | 
					 | 
				
			||||||
      ret = th_->start();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return ret;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void stop() override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (th_ != nullptr) {
 | 
					 | 
				
			||||||
      th_->runnable_->set_stop(true);
 | 
					 | 
				
			||||||
      th_->stop();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void wait() override
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (th_ != nullptr) {
 | 
					 | 
				
			||||||
      th_->wait();
 | 
					 | 
				
			||||||
      destroy();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  void destroy()
 | 
					 | 
				
			||||||
  {
 | 
					 | 
				
			||||||
    if (th_ != nullptr) {
 | 
					 | 
				
			||||||
      th_->destroy();
 | 
					 | 
				
			||||||
      th_->~MyObThreadPool();
 | 
					 | 
				
			||||||
      th_ = nullptr;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
private:
 | 
					 | 
				
			||||||
  char buf_[sizeof(MyObThreadPool)];
 | 
					 | 
				
			||||||
  MyObThreadPool *th_ = nullptr;
 | 
					 | 
				
			||||||
  int64_t thread_cnt_;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // end of namespace share
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
BIND_TG_CLS(lib::TGType::OB_THREAD_POOL, share::ObTG<lib::TGType::OB_THREAD_POOL>);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
} // end of namespace oceanbase
 | 
					} // end of namespace oceanbase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif // OB_THREAD_MGR_H_
 | 
					#endif // OB_THREAD_MGR_H_
 | 
				
			||||||
 | 
				
			|||||||
@ -270,10 +270,8 @@ void ObTenantBase::destroy_mtl_module()
 | 
				
			|||||||
  created_ = false;
 | 
					  created_ = false;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ObCgroupCtrl *ObTenantBase::get_cgroup(lib::ThreadCGroup cgroup)
 | 
					ObCgroupCtrl *ObTenantBase::get_cgroup()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  // TODO
 | 
					 | 
				
			||||||
  UNUSED(cgroup);
 | 
					 | 
				
			||||||
  ObCgroupCtrl *cgroup_ctrl = nullptr;
 | 
					  ObCgroupCtrl *cgroup_ctrl = nullptr;
 | 
				
			||||||
  cgroup_ctrl = cgroups_;
 | 
					  cgroup_ctrl = cgroups_;
 | 
				
			||||||
  return cgroup_ctrl;
 | 
					  return cgroup_ctrl;
 | 
				
			||||||
@ -283,7 +281,7 @@ int ObTenantBase::pre_run(lib::Threads *th)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObTenantEnv::set_tenant(this);
 | 
					  ObTenantEnv::set_tenant(this);
 | 
				
			||||||
  ObCgroupCtrl *cgroup_ctrl = get_cgroup(th->get_cgroup());
 | 
					  ObCgroupCtrl *cgroup_ctrl = get_cgroup();
 | 
				
			||||||
  if (cgroup_ctrl != nullptr) {
 | 
					  if (cgroup_ctrl != nullptr) {
 | 
				
			||||||
    ret = cgroup_ctrl->add_self_to_cgroup(id_);
 | 
					    ret = cgroup_ctrl->add_self_to_cgroup(id_);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
@ -296,7 +294,7 @@ int ObTenantBase::end_run(lib::Threads *th)
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
  int ret = OB_SUCCESS;
 | 
					  int ret = OB_SUCCESS;
 | 
				
			||||||
  ObTenantEnv::set_tenant(nullptr);
 | 
					  ObTenantEnv::set_tenant(nullptr);
 | 
				
			||||||
  ObCgroupCtrl *cgroup_ctrl = get_cgroup(th->get_cgroup());
 | 
					  ObCgroupCtrl *cgroup_ctrl = get_cgroup();
 | 
				
			||||||
  if (cgroup_ctrl != nullptr) {
 | 
					  if (cgroup_ctrl != nullptr) {
 | 
				
			||||||
    ret = cgroup_ctrl->remove_self_from_cgroup(id_);
 | 
					    ret = cgroup_ctrl->remove_self_from_cgroup(id_);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
				
			|||||||
@ -416,7 +416,7 @@ public:
 | 
				
			|||||||
  int init(ObCgroupCtrl *cgroup = nullptr);
 | 
					  int init(ObCgroupCtrl *cgroup = nullptr);
 | 
				
			||||||
  void destroy();
 | 
					  void destroy();
 | 
				
			||||||
  virtual inline uint64_t id() const override { return id_; }
 | 
					  virtual inline uint64_t id() const override { return id_; }
 | 
				
			||||||
  ObCgroupCtrl *get_cgroup(lib::ThreadCGroup cgroup);
 | 
					  ObCgroupCtrl *get_cgroup();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  const ObTenantModuleInitCtx *get_mtl_init_ctx() const { return mtl_init_ctx_; }
 | 
					  const ObTenantModuleInitCtx *get_mtl_init_ctx() const { return mtl_init_ctx_; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1312,7 +1312,7 @@ int ObTenantDagWorker::init(const int64_t check_period)
 | 
				
			|||||||
    COMMON_LOG(WARN, "dag worker is inited twice", K(ret));
 | 
					    COMMON_LOG(WARN, "dag worker is inited twice", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(cond_.init(ObWaitEventIds::DAG_WORKER_COND_WAIT))) {
 | 
					  } else if (OB_FAIL(cond_.init(ObWaitEventIds::DAG_WORKER_COND_WAIT))) {
 | 
				
			||||||
    COMMON_LOG(WARN, "failed to init cond", K(ret));
 | 
					    COMMON_LOG(WARN, "failed to init cond", K(ret));
 | 
				
			||||||
  } else if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::DagWorker, tg_id_, lib::ThreadCGroup::BACK_CGROUP))) {
 | 
					  } else if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::DagWorker, tg_id_))) {
 | 
				
			||||||
    COMMON_LOG(WARN, "TG create dag worker failed", K(ret));
 | 
					    COMMON_LOG(WARN, "TG create dag worker failed", K(ret));
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    check_period_ = check_period;
 | 
					    check_period_ = check_period;
 | 
				
			||||||
@ -1599,7 +1599,7 @@ int ObTenantDagScheduler::init(
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    get_default_config();
 | 
					    get_default_config();
 | 
				
			||||||
    dag_limit_ = dag_limit;
 | 
					    dag_limit_ = dag_limit;
 | 
				
			||||||
    if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::DagScheduler, tg_id_, lib::ThreadCGroup::BACK_CGROUP))) {
 | 
					    if (OB_FAIL(TG_CREATE_TENANT(lib::TGDefIDs::DagScheduler, tg_id_))) {
 | 
				
			||||||
      COMMON_LOG(WARN, "TG create dag scheduler failed", K(ret));
 | 
					      COMMON_LOG(WARN, "TG create dag scheduler failed", K(ret));
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user