From 4ce250c313040b417624120c91ad225a30927321 Mon Sep 17 00:00:00 2001 From: LiuYoung00 Date: Thu, 3 Nov 2022 11:38:02 +0000 Subject: [PATCH] [CP] close cursor when add fail --- src/sql/session/ob_sql_session_info.cpp | 26 +++++++++++++++++++++++++ src/sql/session/ob_sql_session_info.h | 1 + 2 files changed, 27 insertions(+) diff --git a/src/sql/session/ob_sql_session_info.cpp b/src/sql/session/ob_sql_session_info.cpp index 48bc67e136..c3329974af 100644 --- a/src/sql/session/ob_sql_session_info.cpp +++ b/src/sql/session/ob_sql_session_info.cpp @@ -1218,6 +1218,7 @@ int ObSQLSessionInfo::add_cursor(pl::ObPLCursorInfo *cursor) // open_cursors is 0 to indicate a special state, no limit is set #define NEED_CHECK_SESS_OPEN_CURSORS_LIMIT(v) (0 == v ? false : true) int ret = OB_SUCCESS; + bool add_cursor_success = false; omt::ObTenantConfigGuard tenant_config(TENANT_CONF(get_effective_tenant_id())); CK (tenant_config.is_valid()); CK (OB_NOT_NULL(cursor)); @@ -1251,6 +1252,7 @@ int ObSQLSessionInfo::add_cursor(pl::ObPLCursorInfo *cursor) LOG_WARN("fail insert ps id to hash map", K(id), K(*cursor), K(ret)); } else { cursor->set_id(id); + add_cursor_success = true; if (lib::is_diagnose_info_enabled()) { EVENT_INC(SQL_OPEN_CURSORS_CURRENT); EVENT_INC(SQL_OPEN_CURSORS_CUMULATIVE); @@ -1258,6 +1260,30 @@ int ObSQLSessionInfo::add_cursor(pl::ObPLCursorInfo *cursor) LOG_DEBUG("ps cursor: add cursor", K(ret), K(id), K(get_sessid())); } } + if (!add_cursor_success && OB_NOT_NULL(cursor)) { + int64_t id = cursor->get_id(); + int tmp_ret = close_cursor(cursor); + ret = OB_SUCCESS == ret ? tmp_ret : ret; + if (OB_SUCCESS != tmp_ret) { + LOG_WARN("close cursor fail when add cursor to sesssion.", K(ret), K(id), K(get_sessid())); + } + } + return ret; +} + +int ObSQLSessionInfo::close_cursor(ObPLCursorInfo *&cursor) +{ + int ret = OB_SUCCESS; + if (OB_NOT_NULL(cursor)) { + int64_t id = cursor->get_id(); + OZ (cursor->close(*this)); + cursor->~ObPLCursorInfo(); + get_cursor_allocator().free(cursor); + cursor = NULL; + LOG_DEBUG("close cursor", K(ret), K(id), K(get_sessid())); + } else { + LOG_DEBUG("close cursor is null", K(get_sessid())); + } return ret; } diff --git a/src/sql/session/ob_sql_session_info.h b/src/sql/session/ob_sql_session_info.h index 74530873e5..8d01964a7e 100644 --- a/src/sql/session/ob_sql_session_info.h +++ b/src/sql/session/ob_sql_session_info.h @@ -676,6 +676,7 @@ public: pl::ObPLCursorInfo *get_cursor(int64_t cursor_id); pl::ObDbmsCursorInfo *get_dbms_cursor(int64_t cursor_id); int add_cursor(pl::ObPLCursorInfo *cursor); + int close_cursor(pl::ObPLCursorInfo *&cursor); int close_cursor(int64_t cursor_id); int make_cursor(pl::ObPLCursorInfo *&cursor); int init_cursor_cache(); -- GitLab