fix ObMultiTenantOperator iter stop tenant
This commit is contained in:
@ -1757,6 +1757,32 @@ int ObMultiTenant::get_tenant_with_tenant_lock(
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObMultiTenant::get_active_tenant_with_tenant_lock(
|
||||
const uint64_t tenant_id, ObLDHandle &handle, ObTenant *&tenant) const
|
||||
{
|
||||
SpinRLockGuard guard(lock_);
|
||||
ObTenant *tenant_tmp = nullptr;
|
||||
int ret = get_tenant_unsafe(tenant_id, tenant_tmp);
|
||||
if (OB_SUCC(ret)) {
|
||||
if (tenant_tmp->has_stopped()) {
|
||||
ret = OB_TENANT_NOT_IN_SERVER;
|
||||
} else if (OB_FAIL(tenant_tmp->try_rdlock(handle))) {
|
||||
if (tenant_tmp->has_stopped()) {
|
||||
// in some cases this error code is handled specially
|
||||
ret = OB_TENANT_NOT_IN_SERVER;
|
||||
LOG_WARN("fail to try rdlock tenant", K(ret), K(tenant_id));
|
||||
}
|
||||
} else {
|
||||
// assign tenant when get rdlock succ
|
||||
tenant = tenant_tmp;
|
||||
}
|
||||
if (OB_UNLIKELY(tenant_tmp->has_stopped())) {
|
||||
LOG_WARN("get rdlock when tenant has stopped", K(tenant_id), K(lbt()));
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ObMultiTenant::get_tenant_unsafe( const uint64_t tenant_id, ObTenant *&tenant) const
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
@ -117,6 +117,7 @@ public:
|
||||
int update_tenant_dag_scheduler_config();
|
||||
int get_tenant(const uint64_t tenant_id, ObTenant *&tenant) const;
|
||||
int get_tenant_with_tenant_lock(const uint64_t tenant_id, common::ObLDHandle &handle, ObTenant *&tenant) const;
|
||||
int get_active_tenant_with_tenant_lock(const uint64_t tenant_id, common::ObLDHandle &handle, ObTenant *&tenant) const;
|
||||
int update_tenant(uint64_t tenant_id, std::function<int(ObTenant&)> &&func);
|
||||
int recv_request(const uint64_t tenant_id, rpc::ObRequest &req);
|
||||
int update_tenant_freezer_mem_limit(const uint64_t tenant_id,
|
||||
|
@ -111,12 +111,13 @@ int ObMultiTenantOperator::execute(common::ObNewRow *&row)
|
||||
uint64_t tenant_id = tenant_ids_.at(tenant_idx_);
|
||||
int process_ret = OB_SUCCESS;
|
||||
if (tenant_ == nullptr) {
|
||||
if (OB_FAIL(GCTX.omt_->get_tenant_with_tenant_lock(tenant_id, handle_, tenant_))) {
|
||||
if (OB_FAIL(GCTX.omt_->get_active_tenant_with_tenant_lock(tenant_id, handle_, tenant_))) {
|
||||
LOG_WARN("get_tenant_with_tenant_lock", K(ret), K(tenant_id));
|
||||
}
|
||||
} else {
|
||||
// check iter tenant
|
||||
if (tenant_->id() != tenant_id) {
|
||||
LOG_ERROR("ObMultiTenantOperator::reset", K(tenant_id), K(tenant_->id()));
|
||||
LOG_ERROR("ObMultiTenantOperator tenant mismatch", K(tenant_ids_), K(tenant_idx_), K(tenant_id), K(tenant_->id()));
|
||||
abort();
|
||||
}
|
||||
}
|
||||
@ -126,8 +127,8 @@ int ObMultiTenantOperator::execute(common::ObNewRow *&row)
|
||||
}
|
||||
if (OB_SUCC(ret)) {
|
||||
if (process_ret == OB_SUCCESS) {
|
||||
break;
|
||||
// succ do nothing
|
||||
break;
|
||||
} else if (process_ret == OB_ITER_END) {
|
||||
{
|
||||
// release last tenant obj
|
||||
|
Reference in New Issue
Block a user