[CP] [to #55446815] fix: last_trace_id() in PL/SQL

This commit is contained in:
haohao022
2024-04-30 02:56:33 +00:00
committed by ob-robot
parent 2f57bd7cec
commit 963b0090aa

View File

@ -1628,8 +1628,11 @@ public:
}; };
struct ObPLSPITraceIdGuard { struct ObPLSPITraceIdGuard {
ObPLSPITraceIdGuard(const ObString &sql, const ObString &ps_sql, ObCurTraceId::TraceId *reused_trace_id = nullptr) ObPLSPITraceIdGuard(const ObString &sql,
: sql_(sql), ps_sql_(ps_sql) { const ObString &ps_sql,
ObSQLSessionInfo &session,
ObCurTraceId::TraceId *reused_trace_id = nullptr)
: sql_(sql), ps_sql_(ps_sql), session_(session) {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
if (OB_NOT_NULL(ObCurTraceId::get_trace_id())) { if (OB_NOT_NULL(ObCurTraceId::get_trace_id())) {
origin_trace_id_.set(*ObCurTraceId::get_trace_id()); origin_trace_id_.set(*ObCurTraceId::get_trace_id());
@ -1657,6 +1660,7 @@ struct ObPLSPITraceIdGuard {
ObCurTraceId::TraceId curr_trace_id; ObCurTraceId::TraceId curr_trace_id;
if (OB_NOT_NULL(ObCurTraceId::get_trace_id())) { if (OB_NOT_NULL(ObCurTraceId::get_trace_id())) {
curr_trace_id.set(*ObCurTraceId::get_trace_id()); curr_trace_id.set(*ObCurTraceId::get_trace_id());
session_.set_last_trace_id(ObCurTraceId::get_trace_id());
ObCurTraceId::get_trace_id()->set(origin_trace_id_); ObCurTraceId::get_trace_id()->set(origin_trace_id_);
LOG_TRACE("sql execution finished, trace id restored", LOG_TRACE("sql execution finished, trace id restored",
@ -1668,6 +1672,7 @@ struct ObPLSPITraceIdGuard {
ObCurTraceId::TraceId origin_trace_id_; ObCurTraceId::TraceId origin_trace_id_;
const ObString sql_; const ObString sql_;
const ObString ps_sql_; const ObString ps_sql_;
ObSQLSessionInfo& session_;
}; };
//todo:@hr351303 确认sql 和 ps sql是否可以合一 //todo:@hr351303 确认sql 和 ps sql是否可以合一
@ -1692,7 +1697,6 @@ int ObSPIService::spi_inner_execute(ObPLExecCtx *ctx,
ObWarningBuffer* wb = NULL; ObWarningBuffer* wb = NULL;
FLTSpanGuard(pl_spi_query); FLTSpanGuard(pl_spi_query);
CK (OB_NOT_NULL(ctx)); CK (OB_NOT_NULL(ctx));
ObPLSPITraceIdGuard trace_id_guard(sql, ps_sql);
CK (OB_NOT_NULL(ctx->allocator_)); CK (OB_NOT_NULL(ctx->allocator_));
CK (OB_NOT_NULL(ctx->exec_ctx_)); CK (OB_NOT_NULL(ctx->exec_ctx_));
CK (OB_NOT_NULL(ctx->exec_ctx_->get_my_session())); CK (OB_NOT_NULL(ctx->exec_ctx_->get_my_session()));
@ -1706,6 +1710,7 @@ int ObSPIService::spi_inner_execute(ObPLExecCtx *ctx,
exec_timestamp.exec_type_ = sql::PLSql; exec_timestamp.exec_type_ = sql::PLSql;
ObSQLSessionInfo *session = ctx->exec_ctx_->get_my_session(); ObSQLSessionInfo *session = ctx->exec_ctx_->get_my_session();
ObPLSPITraceIdGuard trace_id_guard(sql, ps_sql, *session);
ObPLSubPLSqlTimeGuard guard(ctx); ObPLSubPLSqlTimeGuard guard(ctx);
if (OB_SUCC(ret) && is_forall && !session->is_enable_batched_multi_statement()) { if (OB_SUCC(ret) && is_forall && !session->is_enable_batched_multi_statement()) {
/* forall need rollback to for loop */ /* forall need rollback to for loop */
@ -3003,7 +3008,7 @@ int ObSPIService::spi_execute_immediate(ObPLExecCtx *ctx,
OZ (spi_result.start_nested_stmt_if_need(ctx, sql_str.string(), stmt_type, for_update)); OZ (spi_result.start_nested_stmt_if_need(ctx, sql_str.string(), stmt_type, for_update));
// Step2: execute dynamic SQL now! // Step2: execute dynamic SQL now!
ObPLSPITraceIdGuard trace_id_guard(sql_str.string(), ps_sql); ObPLSPITraceIdGuard trace_id_guard(sql_str.string(), ps_sql, *session);
if (OB_FAIL(ret)) { if (OB_FAIL(ret)) {
} else if (need_execute_sql) { } else if (need_execute_sql) {
ObExecRecord exec_record; ObExecRecord exec_record;
@ -3955,7 +3960,7 @@ int ObSPIService::spi_cursor_open(ObPLExecCtx *ctx,
} }
cursor->set_last_execute_time(ObTimeUtility::current_time()); cursor->set_last_execute_time(ObTimeUtility::current_time());
} else { //MySQL Cursor/Updated Cursor/Server Cursor(REF_CURSOR, PACKAGE CURSOR) } else { //MySQL Cursor/Updated Cursor/Server Cursor(REF_CURSOR, PACKAGE CURSOR)
ObPLSPITraceIdGuard trace_id_guard(sql, ps_sql); ObPLSPITraceIdGuard trace_id_guard(sql, ps_sql, *session_info);
HEAP_VAR(ObSPIResultSet, spi_result) { HEAP_VAR(ObSPIResultSet, spi_result) {
ObString sqlstr(sql); ObString sqlstr(sql);
OZ (spi_result.init(*session_info)); OZ (spi_result.init(*session_info));
@ -4318,7 +4323,7 @@ int ObSPIService::dbms_cursor_open(ObPLExecCtx *ctx,
int64_t tenant_version = 0; int64_t tenant_version = 0;
int64_t sys_version = 0; int64_t sys_version = 0;
int64_t retry_cnt = 0; int64_t retry_cnt = 0;
ObPLSPITraceIdGuard trace_id_guard(sql_stmt,ps_sql); ObPLSPITraceIdGuard trace_id_guard(sql_stmt, ps_sql, *session);
int64_t old_query_start_time = session->get_query_start_time(); int64_t old_query_start_time = session->get_query_start_time();
int64_t new_query_start_time = ObTimeUtility::current_time(); int64_t new_query_start_time = ObTimeUtility::current_time();
if (!cursor.is_ps_cursor()) { if (!cursor.is_ps_cursor()) {
@ -4576,8 +4581,8 @@ int ObSPIService::do_cursor_fetch(ObPLExecCtx *ctx,
} else if (!cursor->is_streaming()) { \ } else if (!cursor->is_streaming()) { \
bool can_retry = true; \ bool can_retry = true; \
ret = get_result(ctx, \ ret = get_result(ctx, \
static_cast<void*>((cursor)->get_spi_cursor()), \ static_cast<void*>((cursor)->get_spi_cursor()), \
false, \ false, \
into_exprs, \ into_exprs, \
into_count, \ into_count, \
column_types, \ column_types, \
@ -4595,8 +4600,8 @@ int ObSPIService::do_cursor_fetch(ObPLExecCtx *ctx,
false, \ false, \
limit, \ limit, \
return_types, \ return_types, \
return_type_count, \ return_type_count, \
is_type_record); \ is_type_record); \
} else { \ } else { \
ObString sql; \ ObString sql; \
ObString ps_sql; \ ObString ps_sql; \
@ -4605,14 +4610,15 @@ int ObSPIService::do_cursor_fetch(ObPLExecCtx *ctx,
} else { \ } else { \
sql = spi_result->get_sql_ctx().cur_sql_; \ sql = spi_result->get_sql_ctx().cur_sql_; \
} \ } \
ObPLSPITraceIdGuard trace_id_guard(sql, ps_sql, cursor->get_sql_trace_id()); \ ObPLSPITraceIdGuard trace_id_guard( \
sql, ps_sql, *session, cursor->get_sql_trace_id()); \
if (cursor->get_sql_trace_id()->is_invalid() \ if (cursor->get_sql_trace_id()->is_invalid() \
&& OB_NOT_NULL(ObCurTraceId::get_trace_id())) { \ && OB_NOT_NULL(ObCurTraceId::get_trace_id())) { \
cursor->get_sql_trace_id()->set(*ObCurTraceId::get_trace_id()); \ cursor->get_sql_trace_id()->set(*ObCurTraceId::get_trace_id()); \
} \ } \
pl_trace_id = trace_id_guard.origin_trace_id_; \ pl_trace_id = trace_id_guard.origin_trace_id_; \
ret = inner_fetch_with_retry(ctx, \ ret = inner_fetch_with_retry(ctx, \
*cursor->get_cursor_handler(), \ *cursor->get_cursor_handler(), \
into_exprs, \ into_exprs, \
into_count, \ into_count, \
column_types, \ column_types, \
@ -4627,8 +4633,8 @@ int ObSPIService::do_cursor_fetch(ObPLExecCtx *ctx,
limit, \ limit, \
cursor->get_last_execute_time(), \ cursor->get_last_execute_time(), \
return_types, \ return_types, \
return_type_count, \ return_type_count, \
is_type_record); \ is_type_record); \
} \ } \
} while(0) } while(0)
@ -4645,7 +4651,7 @@ int ObSPIService::do_cursor_fetch(ObPLExecCtx *ctx,
#undef GET_RESULT #undef GET_RESULT
if (cursor->is_streaming()) { if (cursor->is_streaming()) {
ObPLSPITraceIdGuard trace_id_guard(nullptr, nullptr, cursor->get_sql_trace_id()); ObPLSPITraceIdGuard trace_id_guard(nullptr, nullptr, *session, cursor->get_sql_trace_id());
if (OB_ISNULL(spi_result)) { if (OB_ISNULL(spi_result)) {
ret = OB_ERR_UNEXPECTED; ret = OB_ERR_UNEXPECTED;
LOG_WARN("spi result must be not null in oracle mode", K(ret), K(spi_result)); LOG_WARN("spi result must be not null in oracle mode", K(ret), K(spi_result));