fix ObMultiTenantOperator iter stop tenant

This commit is contained in:
obdev
2023-05-31 10:47:55 +00:00
committed by ob-robot
parent 78041964d2
commit f8b888bd67
3 changed files with 31 additions and 3 deletions

View File

@ -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;

View File

@ -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,

View File

@ -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