Before dtl_interm_result_manager executes mtl_stop and mtl_wait, determine whether mtl_start has been executed.

This commit is contained in:
obdev
2024-01-22 07:17:11 +00:00
committed by ob-robot
parent ef00065d5c
commit 3de97b1dd1
3 changed files with 12 additions and 3 deletions

View File

@ -892,6 +892,7 @@ void ObTenant::mark_tenant_is_removed()
tenant_meta_.unit_.is_removed_ = true; tenant_meta_.unit_.is_removed_ = true;
} }
ERRSIM_POINT_DEF(CREATE_MTL_MODULE_FAIL)
// 初始化租户各子模块,保证初始化同步执行,因为依赖线程局部变量和栈上变量 // 初始化租户各子模块,保证初始化同步执行,因为依赖线程局部变量和栈上变量
int ObTenant::create_tenant_module() int ObTenant::create_tenant_module()
{ {
@ -905,6 +906,10 @@ int ObTenant::create_tenant_module()
if (OB_FAIL(ObTenantBase::create_mtl_module())) { if (OB_FAIL(ObTenantBase::create_mtl_module())) {
LOG_ERROR("create mtl module failed", K(tenant_id), K(ret)); LOG_ERROR("create mtl module failed", K(tenant_id), K(ret));
} else if (CREATE_MTL_MODULE_FAIL) {
ret = CREATE_MTL_MODULE_FAIL;
LOG_ERROR("create_tenant_module failed because of tracepoint CREATE_MTL_MODULE_FAIL",
K(tenant_id), K(ret));
} else if (FALSE_IT(ObTenantEnv::set_tenant(this))) { } else if (FALSE_IT(ObTenantEnv::set_tenant(this))) {
// 上面通过ObTenantSwitchGuard中会创建一个新的TenantBase线程局部变量,而不是存TenantBase的指针, // 上面通过ObTenantSwitchGuard中会创建一个新的TenantBase线程局部变量,而不是存TenantBase的指针,
// 目的是通过MTL()访问时减少一次内存跳转,但是设置的时mtl模块的指针还是nullptr, 所以在mtl创建完成时 // 目的是通过MTL()访问时减少一次内存跳转,但是设置的时mtl模块的指针还是nullptr, 所以在mtl创建完成时

View File

@ -628,6 +628,7 @@ int ObDTLIntermResultManager::mtl_start(ObDTLIntermResultManager *&dtl_interm_re
} else { } else {
dtl_interm_result_manager->get_gc_task().disable_timeout_check(); dtl_interm_result_manager->get_gc_task().disable_timeout_check();
dtl_interm_result_manager->get_gc_task().dtl_interm_result_manager_ = dtl_interm_result_manager; dtl_interm_result_manager->get_gc_task().dtl_interm_result_manager_ = dtl_interm_result_manager;
dtl_interm_result_manager->get_gc_task().is_start_ = true;
} }
} }
return ret; return ret;
@ -635,14 +636,16 @@ int ObDTLIntermResultManager::mtl_start(ObDTLIntermResultManager *&dtl_interm_re
void ObDTLIntermResultManager::mtl_stop(ObDTLIntermResultManager *&dtl_interm_result_manager) void ObDTLIntermResultManager::mtl_stop(ObDTLIntermResultManager *&dtl_interm_result_manager)
{ {
if (OB_LIKELY(nullptr != dtl_interm_result_manager)) { if (OB_LIKELY(nullptr != dtl_interm_result_manager) &&
dtl_interm_result_manager->get_gc_task().is_start_) {
TG_CANCEL_TASK(MTL(omt::ObSharedTimer*)->get_tg_id(), dtl_interm_result_manager->get_gc_task()); TG_CANCEL_TASK(MTL(omt::ObSharedTimer*)->get_tg_id(), dtl_interm_result_manager->get_gc_task());
} }
} }
void ObDTLIntermResultManager::mtl_wait(ObDTLIntermResultManager *&dtl_interm_result_manager) void ObDTLIntermResultManager::mtl_wait(ObDTLIntermResultManager *&dtl_interm_result_manager)
{ {
if (OB_LIKELY(nullptr != dtl_interm_result_manager)) { if (OB_LIKELY(nullptr != dtl_interm_result_manager &&
dtl_interm_result_manager->get_gc_task().is_start_)) {
TG_WAIT_TASK(MTL(omt::ObSharedTimer*)->get_tg_id(), dtl_interm_result_manager->get_gc_task()); TG_WAIT_TASK(MTL(omt::ObSharedTimer*)->get_tg_id(), dtl_interm_result_manager->get_gc_task());
} }
} }

View File

@ -215,11 +215,12 @@ public:
class ObDTLIntermResultGCTask : public common::ObTimerTask class ObDTLIntermResultGCTask : public common::ObTimerTask
{ {
public: public:
ObDTLIntermResultGCTask() : dtl_interm_result_manager_(NULL) {} ObDTLIntermResultGCTask() : dtl_interm_result_manager_(NULL), is_start_(false) {}
virtual ~ObDTLIntermResultGCTask() {} virtual ~ObDTLIntermResultGCTask() {}
virtual void runTimerTask() override; virtual void runTimerTask() override;
const static int64_t REFRESH_INTERVAL = 10 * 1000L * 1000L; // 10秒间隔 const static int64_t REFRESH_INTERVAL = 10 * 1000L * 1000L; // 10秒间隔
ObDTLIntermResultManager *dtl_interm_result_manager_; ObDTLIntermResultManager *dtl_interm_result_manager_;
bool is_start_;
}; };
class ObDTLIntermResultManager class ObDTLIntermResultManager