From f47b3587de691e0bbf8523a5fec1753369cc5ef7 Mon Sep 17 00:00:00 2001 From: Charles0429 Date: Fri, 21 Jul 2023 02:43:13 +0000 Subject: [PATCH] fix create index hang --- .../ddl_task/ob_column_redefinition_task.cpp | 1 + src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp | 6 ++++++ src/rootserver/ddl_task/ob_ddl_redefinition_task.h | 1 + src/rootserver/ddl_task/ob_index_build_task.cpp | 10 ++++++++-- src/rootserver/ddl_task/ob_index_build_task.h | 1 + src/rootserver/ddl_task/ob_table_redefinition_task.cpp | 4 +++- 6 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/rootserver/ddl_task/ob_column_redefinition_task.cpp b/src/rootserver/ddl_task/ob_column_redefinition_task.cpp index be8721694..892cd070e 100644 --- a/src/rootserver/ddl_task/ob_column_redefinition_task.cpp +++ b/src/rootserver/ddl_task/ob_column_redefinition_task.cpp @@ -210,6 +210,7 @@ int ObColumnRedefinitionTask::check_build_single_replica(bool &is_end) { int ret = OB_SUCCESS; is_end = false; + TCRLockGuard guard(lock_); if (OB_UNLIKELY(!is_inited_)) { ret = OB_NOT_INIT; LOG_WARN("ObColumnRedefinitionTask has not been inited", K(ret)); diff --git a/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp b/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp index 8ac92b563..e54eabf7d 100644 --- a/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp +++ b/src/rootserver/ddl_task/ob_ddl_redefinition_task.cpp @@ -2241,3 +2241,9 @@ int ObDDLRedefinitionTask::reap_old_replica_build_task(bool &need_exec_new_inner } return ret; } + +int64_t ObDDLRedefinitionTask::get_build_replica_request_time() +{ + TCRLockGuard guard(lock_); + return build_replica_request_time_; +} diff --git a/src/rootserver/ddl_task/ob_ddl_redefinition_task.h b/src/rootserver/ddl_task/ob_ddl_redefinition_task.h index 96cdc023e..65eff717e 100644 --- a/src/rootserver/ddl_task/ob_ddl_redefinition_task.h +++ b/src/rootserver/ddl_task/ob_ddl_redefinition_task.h @@ -209,6 +209,7 @@ protected: int get_child_task_ids(char *buf, int64_t len); int get_estimated_timeout(const share::schema::ObTableSchema *dst_table_schema, int64_t &estimated_timeout); int get_orig_all_index_tablet_count(ObSchemaGetterGuard &schema_guard, int64_t &all_tablet_count); + int64_t get_build_replica_request_time(); protected: struct DependTaskStatus final { diff --git a/src/rootserver/ddl_task/ob_index_build_task.cpp b/src/rootserver/ddl_task/ob_index_build_task.cpp index 2364b0e07..27812e9b8 100755 --- a/src/rootserver/ddl_task/ob_index_build_task.cpp +++ b/src/rootserver/ddl_task/ob_index_build_task.cpp @@ -852,6 +852,12 @@ int ObIndexBuildTask::check_build_single_replica(bool &is_end) return ret; } +bool ObIndexBuildTask::is_sstable_complete_task_submitted() +{ + TCRLockGuard guard(lock_); + return is_sstable_complete_task_submitted_; +} + int ObIndexBuildTask::wait_data_complement() { int ret = OB_SUCCESS; @@ -868,7 +874,7 @@ int ObIndexBuildTask::wait_data_complement() bool is_request_end = false; // submit a job to complete sstable for the index table on snapshot_version - if (OB_SUCC(ret) && !state_finished && !is_sstable_complete_task_submitted_) { + if (OB_SUCC(ret) && !state_finished && !is_sstable_complete_task_submitted()) { bool need_exec_new_inner_sql = false; if (OB_FAIL(reap_old_replica_build_task(need_exec_new_inner_sql))) { if (OB_EAGAIN == ret) { @@ -885,7 +891,7 @@ int ObIndexBuildTask::wait_data_complement() DEBUG_SYNC(CREATE_INDEX_REPLICA_BUILD); - if (OB_SUCC(ret) && !state_finished && is_sstable_complete_task_submitted_) { + if (OB_SUCC(ret) && !state_finished && is_sstable_complete_task_submitted()) { if (OB_FAIL(check_build_single_replica(is_request_end))) { LOG_WARN("fail to check build single replica", K(ret)); } else if (is_request_end) { diff --git a/src/rootserver/ddl_task/ob_index_build_task.h b/src/rootserver/ddl_task/ob_index_build_task.h index d619d4a5d..e7a945c65 100644 --- a/src/rootserver/ddl_task/ob_index_build_task.h +++ b/src/rootserver/ddl_task/ob_index_build_task.h @@ -138,6 +138,7 @@ private: int check_need_acquire_lob_snapshot(const ObTableSchema *data_table_schema, const ObTableSchema *index_table_schema, bool &need_acquire); + bool is_sstable_complete_task_submitted(); private: static const int64_t OB_INDEX_BUILD_TASK_VERSION = 1; using ObDDLTask::is_inited_; diff --git a/src/rootserver/ddl_task/ob_table_redefinition_task.cpp b/src/rootserver/ddl_task/ob_table_redefinition_task.cpp index d5eefd792..f8d04ac99 100755 --- a/src/rootserver/ddl_task/ob_table_redefinition_task.cpp +++ b/src/rootserver/ddl_task/ob_table_redefinition_task.cpp @@ -269,6 +269,7 @@ int ObTableRedefinitionTask::check_build_replica_timeout() int ObTableRedefinitionTask::check_build_replica_end(bool &is_end) { int ret = OB_SUCCESS; + TCWLockGuard guard(lock_); if (INT64_MAX == complete_sstable_job_ret_code_) { // not complete } else if (OB_SUCCESS != complete_sstable_job_ret_code_) { @@ -327,7 +328,7 @@ int ObTableRedefinitionTask::table_redefinition(const ObDDLTaskStatus next_task_ LOG_WARN("unexpected snapshot", K(ret), KPC(this)); } - if (OB_SUCC(ret) && !is_build_replica_end && 0 == build_replica_request_time_) { + if (OB_SUCC(ret) && !is_build_replica_end && 0 == get_build_replica_request_time()) { bool need_exec_new_inner_sql = false; if (OB_FAIL(reap_old_replica_build_task(need_exec_new_inner_sql))) { if (OB_EAGAIN == ret) { @@ -340,6 +341,7 @@ int ObTableRedefinitionTask::table_redefinition(const ObDDLTaskStatus next_task_ } else if (OB_FAIL(send_build_replica_request())) { LOG_WARN("fail to send build replica request", K(ret)); } else { + TCWLockGuard guard(lock_); build_replica_request_time_ = ObTimeUtility::current_time(); } }