Fix hang in check table empty

This commit is contained in:
Hongqin-Li
2023-03-28 12:41:11 +00:00
committed by ob-robot
parent 1fc98a61ce
commit 838ac9a4e2

View File

@ -311,9 +311,7 @@ int ObDDLRedefinitionTask::check_table_empty(const ObDDLTaskStatus next_task_sta
} else if (OB_FAIL(check_need_check_table_empty(need_check_table_empty))) { } else if (OB_FAIL(check_need_check_table_empty(need_check_table_empty))) {
LOG_WARN("failed to check need check table empty", K(ret)); LOG_WARN("failed to check need check table empty", K(ret));
} else if (need_check_table_empty) { } else if (need_check_table_empty) {
if (OB_FAIL(check_check_table_empty_end(is_check_replica_end))) { if (!is_check_replica_end && 0 == check_table_empty_job_time_) {
LOG_WARN("check build replica end", K(ret));
} else if (!is_check_replica_end && check_table_empty_job_time_ == 0) {
ObCheckConstraintValidationTask task(tenant_id_, object_id_, -1/*constraint id*/, target_object_id_, ObCheckConstraintValidationTask task(tenant_id_, object_id_, -1/*constraint id*/, target_object_id_,
schema_version_, trace_id_, task_id_, true/*check_table_empty*/, schema_version_, trace_id_, task_id_, true/*check_table_empty*/,
obrpc::ObAlterTableArg::AlterConstraintType::ADD_CONSTRAINT); obrpc::ObAlterTableArg::AlterConstraintType::ADD_CONSTRAINT);
@ -324,6 +322,13 @@ int ObDDLRedefinitionTask::check_table_empty(const ObDDLTaskStatus next_task_sta
LOG_INFO("send check constraint request", K(object_id_), K(target_object_id_), K(schema_version_)); LOG_INFO("send check constraint request", K(object_id_), K(target_object_id_), K(schema_version_));
} }
} }
if (OB_SUCC(ret) && !is_check_replica_end) {
if (OB_FAIL(check_check_table_empty_end(is_check_replica_end))) {
LOG_WARN("check build replica end failed", K(ret));
} else if (is_check_replica_end) {
ret = check_table_empty_job_ret_code_;
}
}
} }
if (OB_FAIL(ret) || is_check_replica_end || !need_check_table_empty) { if (OB_FAIL(ret) || is_check_replica_end || !need_check_table_empty) {
@ -1302,10 +1307,20 @@ int ObDDLRedefinitionTask::check_check_table_empty_end(bool &is_end)
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (INT64_MAX == check_table_empty_job_ret_code_) { if (INT64_MAX == check_table_empty_job_ret_code_) {
// not finish // not finish
} else if (OB_SUCCESS != check_table_empty_job_ret_code_) {
ret_code_ = check_table_empty_job_ret_code_;
is_end = true;
LOG_WARN("check table empty job failed", K(ret_code_), K(object_id_), K(target_object_id_));
if (is_replica_build_need_retry(ret_code_)) {
check_table_empty_job_time_ = 0;
check_table_empty_job_ret_code_ = INT64_MAX;
ret_code_ = OB_SUCCESS;
is_end = false;
LOG_INFO("check table empty need retry", K(*this));
}
} else { } else {
is_end = true; is_end = true;
ret_code_ = check_table_empty_job_ret_code_; ret_code_ = check_table_empty_job_ret_code_;
ret = ret_code_;
} }
return ret; return ret;
} }