From 86bdd489529b7b0cadfaa7997fd4e46f125a0488 Mon Sep 17 00:00:00 2001 From: Hongqin-Li Date: Thu, 2 Mar 2023 16:13:07 +0000 Subject: [PATCH] Fix offline ddl enter before index task finish --- src/rootserver/ddl_task/ob_ddl_task.cpp | 15 +++++++++++++++ src/rootserver/ob_ddl_service.cpp | 7 +++++++ src/share/ob_debug_sync_point.h | 1 + 3 files changed, 23 insertions(+) diff --git a/src/rootserver/ddl_task/ob_ddl_task.cpp b/src/rootserver/ddl_task/ob_ddl_task.cpp index 3b34b81921..8c9888341b 100644 --- a/src/rootserver/ddl_task/ob_ddl_task.cpp +++ b/src/rootserver/ddl_task/ob_ddl_task.cpp @@ -2613,6 +2613,21 @@ int ObDDLTaskRecordOperator::check_has_conflict_ddl( } break; } + case ObDDLType::DDL_DOUBLE_TABLE_OFFLINE: + case ObDDLType::DDL_MODIFY_COLUMN: + case ObDDLType::DDL_ADD_PRIMARY_KEY: + case ObDDLType::DDL_DROP_PRIMARY_KEY: + case ObDDLType::DDL_ALTER_PRIMARY_KEY: + case ObDDLType::DDL_ALTER_PARTITION_BY: + case ObDDLType::DDL_DROP_COLUMN: + case ObDDLType::DDL_CONVERT_TO_CHARACTER: + case ObDDLType::DDL_ADD_COLUMN_OFFLINE: + case ObDDLType::DDL_COLUMN_REDEFINITION: + case ObDDLType::DDL_TABLE_REDEFINITION: + case ObDDLType::DDL_DIRECT_LOAD: { + has_conflict_ddl = true; + break; + } default: { // do nothing } diff --git a/src/rootserver/ob_ddl_service.cpp b/src/rootserver/ob_ddl_service.cpp index ddd6f901cc..c774cc21c9 100644 --- a/src/rootserver/ob_ddl_service.cpp +++ b/src/rootserver/ob_ddl_service.cpp @@ -10867,6 +10867,7 @@ int ObDDLService::do_offline_ddl_in_trans(obrpc::ObAlterTableArg &alter_table_ar // submit async build index task if (OB_FAIL(ret)) { } else if (is_double_table_long_running_ddl(ddl_type)) { + bool has_conflict_ddl = false; ObCreateDDLTaskParam param(tenant_id, ddl_type, orig_table_schema, @@ -10882,6 +10883,11 @@ int ObDDLService::do_offline_ddl_in_trans(obrpc::ObAlterTableArg &alter_table_ar (void)snprintf(err_msg, sizeof(err_msg), "%s on temporary table is", ddl_type_str(ddl_type)); LOG_WARN("double table long running ddl on temporary table is disallowed", K(ret), K(ddl_type)); LOG_USER_ERROR(OB_OP_NOT_ALLOW, err_msg); + } else if (OB_FAIL(ObDDLTaskRecordOperator::check_has_conflict_ddl(sql_proxy_, tenant_id, orig_table_schema->get_table_id(), 0, ddl_type, has_conflict_ddl))) { + LOG_WARN("failed to check ddl conflict", K(ret)); + } else if (has_conflict_ddl) { + ret = OB_SCHEMA_EAGAIN; + LOG_WARN("failed to alter table that has conflict ddl", K(ret), K(orig_table_schema->get_table_id())); } else if (OB_FAIL(root_service->get_ddl_scheduler().create_ddl_task(param, trans, task_record))) { LOG_WARN("submit ddl task failed", K(ret)); } else { @@ -19697,6 +19703,7 @@ int ObDDLService::update_index_status(const obrpc::ObUpdateIndexStatusArg &arg) ret = OB_SUCC(ret) ? commit_ret : ret; } } + DEBUG_SYNC(AFTER_UPDATE_INDEX_STATUS); if (OB_SUCC(ret)) { if (OB_FAIL(publish_schema(tenant_id))) { LOG_WARN("publish schema failed", KR(ret)); diff --git a/src/share/ob_debug_sync_point.h b/src/share/ob_debug_sync_point.h index 961e85d4c0..34b00936e8 100644 --- a/src/share/ob_debug_sync_point.h +++ b/src/share/ob_debug_sync_point.h @@ -453,6 +453,7 @@ class ObString; ACT(BEFORE_DATA_TABLETS_MIGRATION_TASK,)\ ACT(AFTER_LS_GC_DELETE_ALL_TABLETS,)\ ACT(BEFORE_ARCHIVE_ADD_LS_TASK,)\ + ACT(AFTER_UPDATE_INDEX_STATUS,)\ ACT(MAX_DEBUG_SYNC_POINT,) DECLARE_ENUM(ObDebugSyncPoint, debug_sync_point, OB_DEBUG_SYNC_POINT_DEF);