diff --git a/src/rootserver/ddl_task/ob_ddl_task.cpp b/src/rootserver/ddl_task/ob_ddl_task.cpp index a9ef64ff81..6ad9e56c33 100644 --- a/src/rootserver/ddl_task/ob_ddl_task.cpp +++ b/src/rootserver/ddl_task/ob_ddl_task.cpp @@ -979,22 +979,12 @@ int ObDDLTask::switch_status(const ObDDLTaskStatus new_status, const bool enable if (OB_ISNULL(root_service = GCTX.root_service_)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("error unexpected, root service must not be nullptr", K(ret)); - } else if (OB_FAIL(root_service->get_schema_service().check_if_tenant_has_been_dropped(dst_tenant_id_, is_tenant_dropped))) { - LOG_WARN("check if tenant has been dropped failed", K(ret), K(dst_tenant_id_)); - } else if (is_tenant_dropped) { - need_retry_ = false; - LOG_INFO("tenant has been dropped, exit anyway", K(ret), K(task_id_), K(parent_task_id_), K(dst_tenant_id_)); - } else if (tenant_id_ != dst_tenant_id_ && - OB_FAIL(root_service->get_schema_service().check_if_tenant_has_been_dropped(tenant_id_, is_tenant_dropped))) { - LOG_WARN("check if tenant has been dropped failed", K(ret), K(tenant_id_)); - } else if (is_tenant_dropped) { - need_retry_ = false; - LOG_INFO("tenant has been dropped, exit anyway", K(ret), K(task_id_), K(parent_task_id_), K(tenant_id_)); - } else if (OB_FAIL(ObAllTenantInfoProxy::is_standby_tenant(&root_service->get_sql_proxy(), dst_tenant_id_, is_standby_tenant))) { - LOG_WARN("check is standby tenant failed", K(ret), K(dst_tenant_id_)); - } else if (is_standby_tenant) { - need_retry_ = false; - LOG_INFO("tenant is standby, exit anyway", K(ret), K(task_id_), K(parent_task_id_), K(dst_tenant_id_)); + } else if (OB_FAIL(ObDDLUtil::check_tenant_status_normal(&root_service->get_sql_proxy(), dst_tenant_id_)) + || OB_FAIL(ObDDLUtil::check_tenant_status_normal(&root_service->get_sql_proxy(), tenant_id_))) { + if (OB_TENANT_HAS_BEEN_DROPPED == ret || OB_STANDBY_READ_ONLY == ret) { + need_retry_ = false; + LOG_INFO("tenant status is abnormal, exit anyway", K(ret), K(task_id_), K(parent_task_id_), K(tenant_id_), K(dst_tenant_id_)); + } } else if (OB_FAIL(trans.start(&root_service->get_sql_proxy(), dst_tenant_id_))) { LOG_WARN("start transaction failed", K(ret)); } else { diff --git a/src/share/ob_ddl_common.cpp b/src/share/ob_ddl_common.cpp index da0e5e066c..1f33a11624 100644 --- a/src/share/ob_ddl_common.cpp +++ b/src/share/ob_ddl_common.cpp @@ -1347,6 +1347,42 @@ int ObDDLUtil::get_tenant_schema_guard( return ret; } +int ObDDLUtil::check_tenant_status_normal( + ObISQLClient *proxy, + const uint64_t check_tenant_id) +{ + int ret = OB_SUCCESS; + bool is_tenant_dropped = false; + bool is_standby_tenant = false; + const ObSimpleTenantSchema *tenant_schema = nullptr; + ObSchemaGetterGuard schema_guard; + if (OB_ISNULL(proxy)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("proxy is null", K(ret)); + } else if (OB_FAIL(GSCHEMASERVICE.get_tenant_schema_guard(OB_SYS_TENANT_ID, schema_guard))) { + LOG_WARN("get sys tenant schema guard failed", K(ret)); + } else if (OB_FAIL(schema_guard.check_if_tenant_has_been_dropped(check_tenant_id, is_tenant_dropped))) { + LOG_WARN("check tenant dropped failed", K(ret), K(check_tenant_id)); + } else if (is_tenant_dropped) { + ret = OB_TENANT_HAS_BEEN_DROPPED; + LOG_INFO("tenant has been dropped", K(ret), K(check_tenant_id)); + } else if (OB_FAIL(schema_guard.get_tenant_info(check_tenant_id, tenant_schema))) { + LOG_WARN("get tenant schema failed", K(ret), K(check_tenant_id)); + } else if (OB_ISNULL(tenant_schema)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexpected error", K(ret), K(check_tenant_id)); + } else if (tenant_schema->is_dropping() || tenant_schema->is_in_recyclebin()) { + ret = OB_TENANT_HAS_BEEN_DROPPED; + LOG_INFO("tenant in dropping or in recyclebin", K(ret), K(check_tenant_id)); + } else if (OB_FAIL(ObAllTenantInfoProxy::is_standby_tenant(proxy, check_tenant_id, is_standby_tenant))) { + LOG_WARN("check is standby tenant failed", K(ret), K(check_tenant_id)); + } else if (is_standby_tenant) { + ret = OB_STANDBY_READ_ONLY; + LOG_INFO("tenant is standby", K(ret), K(check_tenant_id)); + } + return ret; +} + /****************** ObCheckTabletDataComplementOp *************/ int ObCheckTabletDataComplementOp::check_task_inner_sql_session_status( diff --git a/src/share/ob_ddl_common.h b/src/share/ob_ddl_common.h index 54d0801e3a..c4970bdfe7 100644 --- a/src/share/ob_ddl_common.h +++ b/src/share/ob_ddl_common.h @@ -491,6 +491,9 @@ public: share::schema::ObSchemaGetterGuard *&src_tenant_schema_guard, share::schema::ObSchemaGetterGuard *&dst_tenant_schema_guard); + static int check_tenant_status_normal( + ObISQLClient *proxy, + const uint64_t check_tenant_id); private: static int generate_order_by_str( const ObIArray &select_column_ids, diff --git a/src/sql/engine/cmd/ob_ddl_executor_util.cpp b/src/sql/engine/cmd/ob_ddl_executor_util.cpp index b7bf356fea..83ef0d7468 100644 --- a/src/sql/engine/cmd/ob_ddl_executor_util.cpp +++ b/src/sql/engine/cmd/ob_ddl_executor_util.cpp @@ -75,21 +75,15 @@ int ObDDLExecutorUtil::wait_ddl_finish( break; } else { if (OB_FAIL(ret)) { - } else if (OB_TMP_FAIL(GSCHEMASERVICE.check_if_tenant_has_been_dropped( - tenant_id, is_tenant_dropped))) { - LOG_WARN("check if tenant has been dropped failed", K(tmp_ret), K(tenant_id)); - } else if (is_tenant_dropped) { - ret = OB_TENANT_HAS_BEEN_DROPPED; - LOG_WARN("tenant has been dropped", K(ret), K(tenant_id)); - } - - if (OB_FAIL(ret)) { - } else if (OB_TMP_FAIL(ObAllTenantInfoProxy::is_standby_tenant(GCTX.sql_proxy_, tenant_id, is_tenant_standby))) { - LOG_WARN("check is standby tenant failed", K(tmp_ret), K(tenant_id)); - } else if (is_tenant_standby) { - ret = OB_STANDBY_READ_ONLY; - FORWARD_USER_ERROR(ret, "DDL execution status is undecided, please check later if it finishes successfully or not."); - LOG_WARN("tenant is standby now, stop wait", K(ret), K(tenant_id)); + } else if (OB_TMP_FAIL(ObDDLUtil::check_tenant_status_normal(GCTX.sql_proxy_, tenant_id))) { + if (OB_TENANT_HAS_BEEN_DROPPED == tmp_ret) { + ret = OB_TENANT_HAS_BEEN_DROPPED; + LOG_WARN("tenant has been dropped", K(ret), K(tenant_id)); + } else if (OB_STANDBY_READ_ONLY == tmp_ret) { + ret = OB_STANDBY_READ_ONLY; + FORWARD_USER_ERROR(ret, "DDL execution status is undecided, please check later if it finishes successfully or not."); + LOG_WARN("tenant is standby now, stop wait", K(ret), K(tenant_id)); + } } if (OB_FAIL(ret)) { @@ -141,21 +135,15 @@ int ObDDLExecutorUtil::wait_build_index_finish(const uint64_t tenant_id, const i is_finish = true; } else { if (OB_FAIL(ret)) { - } else if (OB_TMP_FAIL(GSCHEMASERVICE.check_if_tenant_has_been_dropped( - tenant_id, is_tenant_dropped))) { - LOG_WARN("check if tenant has been dropped failed", K(tmp_ret), K(tenant_id)); - } else if (is_tenant_dropped) { - ret = OB_TENANT_HAS_BEEN_DROPPED; - LOG_WARN("tenant has been dropped", K(ret), K(tenant_id)); - } - - if (OB_FAIL(ret)) { - } else if (OB_TMP_FAIL(ObAllTenantInfoProxy::is_standby_tenant(GCTX.sql_proxy_, tenant_id, is_tenant_standby))) { - LOG_WARN("check is standby tenant failed", K(tmp_ret), K(tenant_id)); - } else if (is_tenant_standby) { - ret = OB_STANDBY_READ_ONLY; - FORWARD_USER_ERROR(ret, "DDL execution status is undecided, please check later if it finishes successfully or not."); - LOG_WARN("tenant is standby now, stop wait", K(ret), K(tenant_id)); + } else if (OB_TMP_FAIL(ObDDLUtil::check_tenant_status_normal(GCTX.sql_proxy_, tenant_id))) { + if (OB_TENANT_HAS_BEEN_DROPPED == tmp_ret) { + ret = OB_TENANT_HAS_BEEN_DROPPED; + LOG_WARN("tenant has been dropped", K(ret), K(tenant_id)); + } else if (OB_STANDBY_READ_ONLY == tmp_ret) { + ret = OB_STANDBY_READ_ONLY; + FORWARD_USER_ERROR(ret, "DDL execution status is undecided, please check later if it finishes successfully or not."); + LOG_WARN("tenant is standby now, stop wait", K(ret), K(tenant_id)); + } } if (OB_FAIL(ret)) { diff --git a/src/storage/ddl/ob_ddl_server_client.cpp b/src/storage/ddl/ob_ddl_server_client.cpp index 250ab749ff..98433ea2b0 100644 --- a/src/storage/ddl/ob_ddl_server_client.cpp +++ b/src/storage/ddl/ob_ddl_server_client.cpp @@ -400,19 +400,14 @@ int ObDDLServerClient::check_need_stop(const uint64_t tenant_id) bool is_tenant_dropped = false; bool is_tenant_standby = false; if (OB_FAIL(ret)) { - } else if (OB_TMP_FAIL(GSCHEMASERVICE.check_if_tenant_has_been_dropped(tenant_id, is_tenant_dropped))) { - LOG_WARN("check if tenant has been droopped failed", K(tmp_ret), K(tenant_id)); - } else if (is_tenant_dropped) { - ret = OB_TENANT_HAS_BEEN_DROPPED; - LOG_WARN("tenant has been dropped", K(ret), K(tenant_id)); - } - - if (OB_FAIL(ret)) { - } else if (OB_TMP_FAIL(ObAllTenantInfoProxy::is_standby_tenant(GCTX.sql_proxy_, tenant_id, is_tenant_standby))) { - LOG_WARN("check is standby tenant failed", K(tmp_ret), K(tenant_id)); - } else if (is_tenant_standby) { - ret = OB_STANDBY_READ_ONLY; - LOG_WARN("tenant is standby now, stop wait", K(ret), K(tenant_id)); + } else if (OB_TMP_FAIL(ObDDLUtil::check_tenant_status_normal(GCTX.sql_proxy_, tenant_id))) { + if (OB_TENANT_HAS_BEEN_DROPPED == tmp_ret) { + ret = OB_TENANT_HAS_BEEN_DROPPED; + LOG_WARN("tenant has been dropped", K(ret), K(tenant_id)); + } else if (OB_STANDBY_READ_ONLY == tmp_ret) { + ret = OB_STANDBY_READ_ONLY; + LOG_WARN("tenant is standby now, stop wait", K(ret), K(tenant_id)); + } } if (OB_FAIL(ret)) {