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;
|
||||
}
|
||||
|
||||
ERRSIM_POINT_DEF(CREATE_MTL_MODULE_FAIL)
|
||||
// 初始化租户各子模块,保证初始化同步执行,因为依赖线程局部变量和栈上变量
|
||||
int ObTenant::create_tenant_module()
|
||||
{
|
||||
@ -905,6 +906,10 @@ int ObTenant::create_tenant_module()
|
||||
|
||||
if (OB_FAIL(ObTenantBase::create_mtl_module())) {
|
||||
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))) {
|
||||
// 上面通过ObTenantSwitchGuard中会创建一个新的TenantBase线程局部变量,而不是存TenantBase的指针,
|
||||
// 目的是通过MTL()访问时减少一次内存跳转,但是设置的时mtl模块的指针还是nullptr, 所以在mtl创建完成时
|
||||
|
||||
@ -628,6 +628,7 @@ int ObDTLIntermResultManager::mtl_start(ObDTLIntermResultManager *&dtl_interm_re
|
||||
} else {
|
||||
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().is_start_ = true;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
@ -635,14 +636,16 @@ int ObDTLIntermResultManager::mtl_start(ObDTLIntermResultManager *&dtl_interm_re
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
@ -215,11 +215,12 @@ public:
|
||||
class ObDTLIntermResultGCTask : public common::ObTimerTask
|
||||
{
|
||||
public:
|
||||
ObDTLIntermResultGCTask() : dtl_interm_result_manager_(NULL) {}
|
||||
ObDTLIntermResultGCTask() : dtl_interm_result_manager_(NULL), is_start_(false) {}
|
||||
virtual ~ObDTLIntermResultGCTask() {}
|
||||
virtual void runTimerTask() override;
|
||||
const static int64_t REFRESH_INTERVAL = 10 * 1000L * 1000L; // 10秒间隔
|
||||
ObDTLIntermResultManager *dtl_interm_result_manager_;
|
||||
bool is_start_;
|
||||
};
|
||||
|
||||
class ObDTLIntermResultManager
|
||||
|
||||
Reference in New Issue
Block a user