fix fk rebuild twice and adjust single replica build timeout.
This commit is contained in:
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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(),
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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));
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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));
|
||||
|
||||
Reference in New Issue
Block a user