fix fk rebuild twice and adjust single replica build timeout.

This commit is contained in:
obdev
2023-09-13 02:48:02 +00:00
committed by ob-robot
parent 57c943efcc
commit 914713a8d9
9 changed files with 37 additions and 50 deletions

View File

@ -90,15 +90,16 @@ int ObCheckConstraintValidationTask::process()
session_param.ddl_info_.set_source_table_hidden(table_schema->is_user_hidden_table());
session_param.ddl_info_.set_dest_table_hidden(false);
ObTimeoutCtx timeout_ctx;
const int64_t DDL_INNER_SQL_EXECUTE_TIMEOUT = ObDDLUtil::calc_inner_sql_execute_timeout();
SMART_VAR(ObMySQLProxy::MySQLResult, res) {
common::sqlclient::ObMySQLResult *result = NULL;
ObSqlString ddl_schema_hint_str;
if (check_expr_str.empty()) {
ret = OB_ERR_UNEXPECTED;
LOG_WARN("check_expr_str is empty", K(ret));
} else if (OB_FAIL(timeout_ctx.set_trx_timeout_us(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
} else if (OB_FAIL(timeout_ctx.set_trx_timeout_us(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set trx timeout failed", K(ret));
} else if (OB_FAIL(timeout_ctx.set_timeout(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
} else if (OB_FAIL(timeout_ctx.set_timeout(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set timeout failed", K(ret));
} else if (OB_FAIL(ObDDLUtil::generate_ddl_schema_hint_str(table_name, table_schema->get_schema_version(), is_oracle_mode, ddl_schema_hint_str))) {
LOG_WARN("failed to generate ddl schema hint str", K(ret));
@ -348,10 +349,11 @@ int ObForeignKeyConstraintValidationTask::check_fk_constraint_data_valid(
common::sqlclient::ObMySQLResult *result = NULL;
ObSqlString child_ddl_schema_hint_str;
ObSqlString parent_ddl_schema_hint_str;
const int64_t DDL_INNER_SQL_EXECUTE_TIMEOUT = ObDDLUtil::calc_inner_sql_execute_timeout();
// print str like "select c1, c2 from db.t2 where c1 is not null and c2 is not null minus select c3, c4 from db.t1"
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set trx timeout failed", K(ret));
} else if (OB_FAIL(timeout_ctx.set_timeout(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
} else if (OB_FAIL(timeout_ctx.set_timeout(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set timeout failed", K(ret));
} else if (OB_FAIL(ObDDLUtil::generate_ddl_schema_hint_str(child_table_schema.get_table_name_str(), child_table_schema.get_schema_version(), is_oracle_mode, child_ddl_schema_hint_str))) {
LOG_WARN("failed to generate ddl schema hint", K(ret));
@ -816,8 +818,7 @@ int ObConstraintTask::check_replica_end(bool &is_end)
}
if (OB_SUCC(ret) && !is_end) {
const int64_t timeout = OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT;
if (check_replica_request_time_ + timeout < ObTimeUtility::current_time()) {
if (check_replica_request_time_ + ObDDLUtil::calc_inner_sql_execute_timeout() < ObTimeUtility::current_time()) {
check_replica_request_time_ = 0;
}
}

View File

@ -145,6 +145,7 @@ int ObDDLRedefinitionSSTableBuildTask::process()
session_param.consumer_group_id_ = consumer_group_id_;
common::ObAddr *sql_exec_addr = nullptr;
const int64_t DDL_INNER_SQL_EXECUTE_TIMEOUT = ObDDLUtil::calc_inner_sql_execute_timeout();
if (inner_sql_exec_addr_.is_valid()) {
sql_exec_addr = &inner_sql_exec_addr_;
LOG_INFO("inner sql execute addr" , K(*sql_exec_addr));
@ -155,10 +156,10 @@ int ObDDLRedefinitionSSTableBuildTask::process()
user_sql_proxy = GCTX.ddl_sql_proxy_;
}
LOG_INFO("execute sql" , K(sql_string), K(data_table_id_), K(tenant_id_),
"is_strict_mode", is_strict_mode(sql_mode_), K(sql_mode_), K(parallelism_));
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
"is_strict_mode", is_strict_mode(sql_mode_), K(sql_mode_), K(parallelism_), K(DDL_INNER_SQL_EXECUTE_TIMEOUT));
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set trx timeout failed", K(ret));
} else if (OB_FAIL(timeout_ctx.set_timeout(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
} else if (OB_FAIL(timeout_ctx.set_timeout(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set timeout failed", K(ret));
} else {
if (OB_FAIL(user_sql_proxy->write(tenant_id_, sql_string.ptr(), affected_rows,
@ -669,7 +670,7 @@ int ObDDLRedefinitionTask::check_build_single_replica(bool &is_end)
} else if (OB_FAIL(replica_builder_.check_build_end(is_end, complete_sstable_job_ret_code_))) {
LOG_WARN("fail to check build end", K(ret));
} else if (!is_end) {
if (sstable_complete_request_time_ + OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT < ObTimeUtility::current_time()) { // timeout, retry
if (sstable_complete_request_time_ + ObDDLUtil::calc_inner_sql_execute_timeout() < ObTimeUtility::current_time()) { // timeout, retry
is_sstable_complete_task_submitted_ = false;
sstable_complete_request_time_ = 0;
}

View File

@ -132,10 +132,11 @@ int ObIndexSSTableBuildTask::process()
}
DEBUG_SYNC(BEFORE_INDEX_SSTABLE_BUILD_TASK_SEND_SQL);
ObTimeoutCtx timeout_ctx;
LOG_INFO("execute sql" , K(sql_string), K(data_table_id_), K(tenant_id_));
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
const int64_t DDL_INNER_SQL_EXECUTE_TIMEOUT = ObDDLUtil::calc_inner_sql_execute_timeout();
LOG_INFO("execute sql" , K(sql_string), K(data_table_id_), K(tenant_id_), K(DDL_INNER_SQL_EXECUTE_TIMEOUT));
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set trx timeout failed", K(ret));
} else if (OB_FAIL(timeout_ctx.set_timeout(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
} else if (OB_FAIL(timeout_ctx.set_timeout(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set timeout failed", K(ret));
} else if (OB_FAIL(user_sql_proxy->write(tenant_id_, sql_string.ptr(), affected_rows,
oracle_mode ? ObCompatibilityMode::ORACLE_MODE : ObCompatibilityMode::MYSQL_MODE, &session_param, sql_exec_addr))) {
@ -800,8 +801,6 @@ int ObIndexBuildTask::send_build_single_replica_request()
} else {
set_sql_exec_addr(create_index_arg_.inner_sql_exec_addr_); // set to switch_status, if task cancel, we should kill session with inner_sql_exec_addr_
}
const int64_t timeout = OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT;
const int64_t abs_timeout_us = ObTimeUtility::current_time() + timeout;
ObIndexSSTableBuildTask task(
task_id_,
tenant_id_,
@ -820,7 +819,7 @@ int ObIndexBuildTask::send_build_single_replica_request()
create_index_arg_.nls_timestamp_tz_format_))) {
LOG_WARN("failed to set nls format", K(ret), K(create_index_arg_));
} else if (OB_FAIL(root_service_->submit_ddl_single_replica_build_task(task))) {
LOG_WARN("fail to submit task", K(ret), K(*this), K(timeout));
LOG_WARN("fail to submit task", K(ret), KPC(this));
} else {
is_sstable_complete_task_submitted_ = true;
sstable_complete_request_time_ = ObTimeUtility::current_time();
@ -854,8 +853,7 @@ int ObIndexBuildTask::check_build_single_replica(bool &is_end)
}
if (OB_SUCC(ret) && !is_end) {
const int64_t timeout = OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT;
if (sstable_complete_request_time_ + timeout < ObTimeUtility::current_time()) {
if (sstable_complete_request_time_ + ObDDLUtil::calc_inner_sql_execute_timeout() < ObTimeUtility::current_time()) {
is_sstable_complete_task_submitted_ = false;
sstable_complete_request_time_ = 0;
}

View File

@ -92,9 +92,10 @@ int ObUpdateAutoincSequenceTask::process()
// if data_table_id != dest_table_id, meaning this is happening in ddl double write
session_param.ddl_info_.set_source_table_hidden(data_table_id_ != dest_table_id_);
ObObj obj;
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
const int64_t DDL_INNER_SQL_EXECUTE_TIMEOUT = ObDDLUtil::calc_inner_sql_execute_timeout();
if (OB_FAIL(timeout_ctx.set_trx_timeout_us(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set trx timeout failed", K(ret));
} else if (OB_FAIL(timeout_ctx.set_timeout(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT))) {
} else if (OB_FAIL(timeout_ctx.set_timeout(DDL_INNER_SQL_EXECUTE_TIMEOUT))) {
LOG_WARN("set timeout failed", K(ret));
} else if (OB_FAIL(sql.assign_fmt("SELECT /*+no_rewrite*/ CAST(MAX(`%s`) AS SIGNED) AS MAX_VALUE FROM `%s`.`%s`",
column_schema->get_column_name(),

View File

@ -288,22 +288,6 @@ int ObTableRedefinitionTask::send_build_replica_request_by_sql()
return ret;
}
int ObTableRedefinitionTask::check_build_replica_timeout()
{
int ret = OB_SUCCESS;
if (OB_UNLIKELY(!is_inited_)) {
ret = OB_NOT_INIT;
LOG_WARN("ObTableRedefinitionTask has not been inited", K(ret));
} else if (build_replica_request_time_ > 0) {
const int64_t timeout = OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT;
const int64_t current_time = ObTimeUtility::current_time();
if (build_replica_request_time_ + timeout < current_time) {
ret = OB_TIMEOUT;
}
}
return ret;
}
int ObTableRedefinitionTask::check_build_replica_end(bool &is_end)
{
int ret = OB_SUCCESS;
@ -389,11 +373,6 @@ int ObTableRedefinitionTask::table_redefinition(const ObDDLTaskStatus next_task_
LOG_WARN("check build replica end failed", K(ret));
}
}
if (OB_SUCC(ret) && !is_build_replica_end) {
if (OB_FAIL(check_build_replica_timeout())) {
LOG_WARN("fail to check build replica timeout", K(ret));
}
}
// overwrite ret
if (is_build_replica_end) {

View File

@ -93,7 +93,6 @@ private:
int copy_table_foreign_keys();
int send_build_replica_request();
int send_build_replica_request_by_sql();
int check_build_replica_timeout();
int check_build_replica_end(bool &is_end);
int replica_end_check(const int ret_code);
int check_modify_autoinc(bool &modify_autoinc);

View File

@ -16123,10 +16123,11 @@ int ObDDLService::get_rebuild_foreign_key_infos(
LOG_WARN("unexpected fk", K(ret), K(new_fk_info), K(orig_table_id));
}
}
if (OB_FAIL(ret)) {
} else if (need_rebuild && OB_FAIL(rebuild_fk_infos.push_back(new_fk_info))) {
LOG_WARN("fail to push back fk infos that need to rebuild", K(ret));
} else {/* do nothing. */}
if (OB_SUCC(ret) && need_rebuild) {
if (OB_FAIL(rebuild_fk_infos.push_back(new_fk_info))) {
LOG_WARN("fail to push back fk infos that need to rebuild", K(ret));
}
}
}
}
return ret;
@ -16165,10 +16166,12 @@ int ObDDLService::rebuild_hidden_table_foreign_key(
LOG_WARN("failed to build hidden index table map", K(ret));
} else if (OB_FAIL(orig_table_schema.check_if_oracle_compat_mode(is_oracle_mode))) {
LOG_WARN("failed to check if oralce compat mode", K(ret));
} else if (!hidden_table_schema.get_foreign_key_infos().empty()) {
// not empty means already rebuilt.
} else if (OB_FAIL(get_rebuild_foreign_key_infos(alter_table_arg,
orig_table_schema,
rebuild_child_table_fk,
rebuild_fk_infos))) {
orig_table_schema,
rebuild_child_table_fk,
rebuild_fk_infos))) {
LOG_WARN("fail to get fk infos that need to rebuild", K(ret));
} else if (OB_FAIL(inc_table_schema.set_foreign_key_infos(rebuild_fk_infos))) {
LOG_WARN("fail to set fk infos", K(ret));

View File

@ -14,6 +14,7 @@
#define OCEANBASE_SHARE_OB_DDL_COMMON_H
#include "lib/allocator/page_arena.h"
#include "share/config/ob_server_config.h"
#include "share/schema/ob_table_schema.h"
#include "share/schema/ob_schema_service.h"
#include "share/location_cache/ob_location_struct.h"
@ -442,6 +443,10 @@ public:
static int reshape_ddl_column_obj(
common::ObDatum &datum,
const ObObjMeta &obj_meta);
static int64_t calc_inner_sql_execute_timeout()
{
return max(OB_MAX_DDL_SINGLE_REPLICA_BUILD_TIMEOUT, GCONF._ob_ddl_timeout);
}
/**
* NOTICE: The interface is designed for Offline DDL operation only.

View File

@ -2169,7 +2169,7 @@ int ObRemoteScan::prepare_iter(const ObSqlString &sql_string, common::ObCommonSq
session_param.ddl_info_.set_is_ddl(true);
session_param.ddl_info_.set_source_table_hidden(false);
session_param.ddl_info_.set_dest_table_hidden(false);
const int64_t sql_total_timeout = max(7 * 24 * 60 * 60 * 1000 * 1000L, GCONF._ob_ddl_timeout);
const int64_t sql_total_timeout = ObDDLUtil::calc_inner_sql_execute_timeout();
if (OB_ISNULL(sql_proxy)) {
ret = OB_INVALID_ARGUMENT;
LOG_WARN("invalid arg", K(ret));