diff --git a/src/rootserver/ddl_task/ob_ddl_scheduler.cpp b/src/rootserver/ddl_task/ob_ddl_scheduler.cpp index 2cd48dfc23..0320d27eb1 100644 --- a/src/rootserver/ddl_task/ob_ddl_scheduler.cpp +++ b/src/rootserver/ddl_task/ob_ddl_scheduler.cpp @@ -955,6 +955,24 @@ int ObDDLScheduler::update_task_info(const ObDDLTaskID &task_id, return ret; } +int ObDDLScheduler::reschedule_ddl_task(const ObDDLTaskID &task_id, ObDDLTaskRecord &task_record) +{ + int ret = OB_SUCCESS; + common::ObArenaAllocator allocator(lib::ObLabel("reschedule")); + if (OB_UNLIKELY(!task_id.is_valid())) { + ret = OB_INVALID_ARGUMENT; + LOG_WARN("invalid arg", K(ret), K(task_id)); + } else if (OB_FAIL(ObDDLTaskRecordOperator::get_ddl_task_record(task_id.task_id_, + root_service_->get_sql_proxy(), + allocator, + task_record))) { + LOG_WARN("get single ddl task failed", K(ret), K(task_id.task_id_)); + } else if (OB_FAIL(schedule_ddl_task(task_record))) { + LOG_WARN("failed to schedule ddl task", K(ret), K(task_record)); + } + return ret; +} + int ObDDLScheduler::abort_redef_table(const ObDDLTaskID &task_id) { int ret = OB_SUCCESS; @@ -993,13 +1011,11 @@ int ObDDLScheduler::abort_redef_table(const ObDDLTaskID &task_id) LOG_WARN("failed to modify task", K(ret)); if (OB_ENTRY_NOT_EXIST == ret) { int tmp_ret = OB_SUCCESS; - ObSqlString sql_string; - if (OB_TMP_FAIL(ObDDLTaskRecordOperator::get_ddl_task_record(task_id.task_id_, root_service_->get_sql_proxy(), allocator, task_record))) { - LOG_WARN("get single ddl task failed", K(tmp_ret), K(task_id.task_id_)); - } else if (OB_TMP_FAIL(schedule_ddl_task(task_record))) { - LOG_WARN("failed to schedule ddl task", K(tmp_ret), K(task_record)); + if (OB_TMP_FAIL(reschedule_ddl_task(task_id, task_record))) { + LOG_WARN("reschedule ddl task failed", K(tmp_ret), K(task_id)); } else { - ret = OB_SUCCESS; + ret = OB_EAGAIN; + LOG_INFO("schedule ddl task again success, please abort again", K(ret)); } } } else { @@ -1065,12 +1081,11 @@ int ObDDLScheduler::copy_table_dependents(const ObDDLTaskID &task_id, LOG_WARN("failed to modify task", K(ret)); if (OB_ENTRY_NOT_EXIST == ret) { int tmp_ret = OB_SUCCESS; - if (OB_TMP_FAIL(ObDDLTaskRecordOperator::get_ddl_task_record(task_id.task_id_, root_service_->get_sql_proxy(), allocator, task_record))) { - LOG_WARN("get single ddl task failed", K(tmp_ret), K(task_id.task_id_)); - } else if (OB_TMP_FAIL(schedule_ddl_task(task_record))) { - LOG_WARN("failed to schedule ddl task", K(tmp_ret), K(task_record)); + if (OB_TMP_FAIL(reschedule_ddl_task(task_id, task_record))) { + LOG_WARN("reschedule ddl task failed", K(tmp_ret), K(task_id)); } else { - ret = OB_SUCCESS; + ret = OB_EAGAIN; + LOG_INFO("schedule ddl task again success, please copy table deps again", K(ret)); } } } else { @@ -1137,13 +1152,11 @@ int ObDDLScheduler::finish_redef_table(const ObDDLTaskID &task_id) LOG_WARN("failed to modify task", K(ret)); if (OB_ENTRY_NOT_EXIST == ret) { int tmp_ret = OB_SUCCESS; - ObSqlString sql_string; - if (OB_TMP_FAIL(ObDDLTaskRecordOperator::get_ddl_task_record(task_id.task_id_, root_service_->get_sql_proxy(), allocator, task_record))) { - LOG_WARN("get single ddl task failed", K(tmp_ret), K(task_id.task_id_)); - } else if (OB_TMP_FAIL(schedule_ddl_task(task_record))) { - LOG_WARN("failed to schedule ddl task", K(tmp_ret), K(task_record)); + if (OB_TMP_FAIL(reschedule_ddl_task(task_id, task_record))) { + LOG_WARN("reschedule ddl task failed", K(tmp_ret), K(task_id)); } else { - ret = OB_SUCCESS; + ret = OB_EAGAIN; + LOG_INFO("schedule ddl task again success, please finish redef table again", K(ret)); } } } else { diff --git a/src/rootserver/ddl_task/ob_ddl_scheduler.h b/src/rootserver/ddl_task/ob_ddl_scheduler.h index 76fb2a50e6..756d69a185 100644 --- a/src/rootserver/ddl_task/ob_ddl_scheduler.h +++ b/src/rootserver/ddl_task/ob_ddl_scheduler.h @@ -225,7 +225,7 @@ public: int finish_redef_table(const ObDDLTaskID &task_id); int start_redef_table(const obrpc::ObStartRedefTableArg &arg, obrpc::ObStartRedefTableRes &res); int update_ddl_task_active_time(const ObDDLTaskID &task_id); - + int reschedule_ddl_task(const ObDDLTaskID &task_id, ObDDLTaskRecord &task_record); int prepare_alter_table_arg(const ObPrepareAlterTableArgParam ¶m, const ObTableSchema *target_table_schema, obrpc::ObAlterTableArg &alter_table_arg);