[CP] [to #2024071900103852700] fix: always call DEBUG_STOP after DEBUG_START succeeded
This commit is contained in:
@ -69,6 +69,12 @@ extern int sys_pkg_need_priv_check(uint64_t pkg_id, ObSchemaGetterGuard *schema_
|
||||
}
|
||||
namespace pl
|
||||
{
|
||||
|
||||
|
||||
#ifdef ERRSIM
|
||||
ERRSIM_POINT_DEF(OBPLCONTEXT_INIT);
|
||||
#endif // ERRSIM
|
||||
|
||||
int ObPL::init(common::ObMySQLProxy &sql_proxy)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
@ -608,6 +614,11 @@ int ObPLContext::init(ObSQLSessionInfo &session_info,
|
||||
const bool is_dblink)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
|
||||
// to mark what session status we need to do to rollback if init failed
|
||||
bool need_remove_top_stack = false;
|
||||
bool need_debug_stop = false;
|
||||
|
||||
int64_t pl_block_timeout = 0;
|
||||
int64_t query_start_time = session_info.get_query_start_time();
|
||||
if (!is_dblink) {
|
||||
@ -648,7 +659,6 @@ int ObPLContext::init(ObSQLSessionInfo &session_info,
|
||||
}
|
||||
}
|
||||
if (lib::is_oracle_mode()) {
|
||||
OZ (ObPLContext::debug_start(&session_info));
|
||||
if (OB_SUCC(ret) && !in_nested_sql_ctrl()) {
|
||||
/*!
|
||||
* 如果已经开始了STMT, 说明在嵌套语句中, 此时不需要设置SAVEPOINT,
|
||||
@ -690,6 +700,7 @@ int ObPLContext::init(ObSQLSessionInfo &session_info,
|
||||
OZ (session_info.store_top_query_string(cur_query_));
|
||||
OZ (recursion_ctx_.init(session_info));
|
||||
OX (session_info.set_pl_stack_ctx(this));
|
||||
OX (need_remove_top_stack = true);
|
||||
OX (session_info.set_pl_can_retry(true));
|
||||
} else if (is_function_or_trigger && lib::is_mysql_mode()) {
|
||||
//mysql模式, 内层function或者trigger不需要创建隐式savepoint, 只需要重置ac
|
||||
@ -723,6 +734,14 @@ int ObPLContext::init(ObSQLSessionInfo &session_info,
|
||||
if (OB_SUCC(ret) && is_function_or_trigger && lib::is_mysql_mode()) {
|
||||
last_insert_id_ = session_info.get_local_last_insert_id();
|
||||
}
|
||||
#ifdef ERRSIM
|
||||
OX (ret = OBPLCONTEXT_INIT);
|
||||
#endif // ERRSIM
|
||||
OZ (ObPLContext::debug_start(&session_info));
|
||||
OX (need_debug_stop = true);
|
||||
#ifdef ERRSIM
|
||||
OX (ret = OBPLCONTEXT_INIT);
|
||||
#endif // ERRSIM
|
||||
if (OB_SUCC(ret) && is_autonomous_) {
|
||||
has_inner_dml_write_ = session_info.has_exec_inner_dml();
|
||||
session_info.set_has_exec_inner_dml(false);
|
||||
@ -732,10 +751,52 @@ int ObPLContext::init(ObSQLSessionInfo &session_info,
|
||||
OZ (session_info.begin_autonomous_session(saved_session_));
|
||||
OX (saved_has_implicit_savepoint_ = session_info.has_pl_implicit_savepoint());
|
||||
OX (session_info.clear_pl_implicit_savepoint());
|
||||
OZ (ObSqlTransControl::explicit_start_trans(ctx, false));
|
||||
(void) register_after_begin_autonomous_session_for_deadlock_(session_info, last_trans_id);
|
||||
|
||||
if (OB_FAIL(ret)) {
|
||||
// do nothing
|
||||
} else if (OB_FAIL(ObSqlTransControl::explicit_start_trans(ctx, false))) {
|
||||
LOG_WARN("failed to ObSqlTransControl::explicit_start_trans", K(ret));
|
||||
int tmp_ret = session_info.end_autonomous_session(saved_session_);
|
||||
if (OB_SUCCESS != tmp_ret) {
|
||||
LOG_WARN("failed to end_autonomous_session after explicit_start_trans failed, will ignore this error",
|
||||
K(tmp_ret), K(ret));
|
||||
}
|
||||
} else {
|
||||
(void) register_after_begin_autonomous_session_for_deadlock_(session_info, last_trans_id);
|
||||
}
|
||||
}
|
||||
OX (session_info_ = &session_info);
|
||||
|
||||
// add any code may fail before this line.
|
||||
// if it should fail, the side-effect must be cleared by its own, or after this line.
|
||||
|
||||
if (OB_SUCC(ret)) {
|
||||
// this marks init succeed
|
||||
session_info_ = &session_info;
|
||||
} else { // failed to init, do some clean up work
|
||||
// restore autocommit
|
||||
if (reset_autocommit_) {
|
||||
session_info.set_autocommit(true);
|
||||
}
|
||||
|
||||
// restore timeout
|
||||
if (old_worker_timeout_ts_ != 0) {
|
||||
THIS_WORKER.set_timeout_ts(old_worker_timeout_ts_);
|
||||
if (OB_NOT_NULL(ctx.get_physical_plan_ctx())) {
|
||||
ctx.get_physical_plan_ctx()->set_timeout_timestamp(old_phy_plan_timeout_ts_);
|
||||
}
|
||||
}
|
||||
|
||||
// remove top stack
|
||||
if (need_remove_top_stack) {
|
||||
session_info.set_pl_stack_ctx(nullptr);
|
||||
}
|
||||
|
||||
// stop debugger
|
||||
if (need_debug_stop) {
|
||||
IGNORE_RETURN ObPLContext::debug_stop(&session_info);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user