Before dtl_interm_result_manager executes mtl_stop and mtl_wait, determine whether mtl_start has been executed.
This commit is contained in:
@ -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创建完成时
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user