diff --git a/src/sql/dblink/ob_dblink_utils.cpp b/src/sql/dblink/ob_dblink_utils.cpp index 613c6eef2..db33a5b35 100644 --- a/src/sql/dblink/ob_dblink_utils.cpp +++ b/src/sql/dblink/ob_dblink_utils.cpp @@ -800,23 +800,33 @@ int ObDblinkCtxInSession::clean_dblink_conn(const bool force_disconnect) int ret = OB_SUCCESS; #ifdef OB_BUILD_DBLINK uint32_t sessid = 0; - common::sqlclient::ObISQLConnection *dblink_conn =NULL; - oceanbase::common::sqlclient::ObTenantDblinkKeeper *tenant_dblink_keeper = MTL(oceanbase::common::sqlclient::ObTenantDblinkKeeper*); - if (OB_ISNULL(tenant_dblink_keeper)) { + common::sqlclient::ObISQLConnection *dblink_conn = NULL; + // Why do not use MTL(oceanbase::common::sqlclient::ObTenantDblinkKeeper*) ? + // MTL(xxx) accesses the ptr in the cache, we need to access the ptr in the memory. + // In the following scene,we need to know if MTL(ObTenantDblinkKeeper*) has been destroyed or not: + // MTL(ObTenantDblinkKeeper*) destroy firstly, MTL(ObTableApiSessPoolMgr*) destroy later. + // When MTL(ObTableApiSessPoolMgr*) destroy, it will destruct ObSQLSessionInfo which will clean dblink in reset(), + // so we need to know if MTL(ObTenantDblinkKeeper*) has been destroyed to avoid accessing the memory that has been destroyed + if (OB_ISNULL(MTL_CTX())) { // do nothing - } else if (OB_ISNULL(session_info_)) { - ret = OB_ERR_UNEXPECTED; - LOG_WARN("unexcepted null ptr", K(ret), KP(session_info_), KP(tenant_dblink_keeper)); - } else if (FALSE_IT(sessid = session_info_->get_sessid())) { - } else if (OB_FAIL(tenant_dblink_keeper->clean_dblink_conn(sessid, force_disconnect))) { - LOG_WARN("failed to set dblink", KP(dblink_conn), K(sessid), KP(tenant_dblink_keeper), K(force_disconnect), K(ret)); + } else { + oceanbase::common::sqlclient::ObTenantDblinkKeeper *tenant_dblink_keeper = MTL_CTX()->get(); + if (OB_ISNULL(tenant_dblink_keeper)) { + // do nothing + } else if (OB_ISNULL(session_info_)) { + ret = OB_ERR_UNEXPECTED; + LOG_WARN("unexcepted null ptr", K(ret), KP(session_info_), KP(tenant_dblink_keeper)); + } else if (FALSE_IT(sessid = session_info_->get_sessid())) { + } else if (OB_FAIL(tenant_dblink_keeper->clean_dblink_conn(sessid, force_disconnect))) { + LOG_WARN("failed to set dblink", KP(dblink_conn), K(sessid), KP(tenant_dblink_keeper), K(force_disconnect), K(ret)); + } + tx_id_.reset(); + arena_alloc_.reset(); + reverse_dblink_ = NULL; + reverse_dblink_buf_ = NULL; + sys_var_reverse_info_buf_ = NULL; + sys_var_reverse_info_buf_size_ = 0; } - tx_id_.reset(); - arena_alloc_.reset(); - reverse_dblink_ = NULL; - reverse_dblink_buf_ = NULL; - sys_var_reverse_info_buf_ = NULL; - sys_var_reverse_info_buf_size_ = 0; #endif return ret; } diff --git a/unittest/observer/table/test_create_executor.cpp b/unittest/observer/table/test_create_executor.cpp index 1e294f215..3ec322276 100644 --- a/unittest/observer/table/test_create_executor.cpp +++ b/unittest/observer/table/test_create_executor.cpp @@ -33,6 +33,8 @@ using namespace oceanbase::share::schema; using namespace oceanbase::observer; using namespace oceanbase::pl; +namespace oceanbase +{ // copy from test_table_schema.cpp void fill_table_schema(ObTableSchema &table) { @@ -162,6 +164,7 @@ void TestCreateExecutor::SetUp() void TestCreateExecutor::TearDown() { + MTL_CTX()=nullptr; } ObTableApiSessNodeVal g_sess_node_val(NULL, 500); @@ -471,39 +474,6 @@ TEST_F(TestCreateExecutor, cons_column_type) ASSERT_EQ(1, column_info.type_.get_accuracy().get_length()); } -TEST_F(TestCreateExecutor, check_column_type) -{ - ObTableColumnInfo column_info; - column_info.type_.set_result_flag(NOT_NULL_WRITE_FLAG); - ObObj obj; - uint32_t res_flag = 0; - ObTableCtx fake_ctx(allocator_); - schema_service_.get_schema_guard(fake_ctx.schema_guard_, 1); - fake_ctx_init_common(fake_ctx, &table_schema_); - - // check nullable - obj.set_null(); - res_flag |= NOT_NULL_FLAG; - column_info.type_.set_result_flag(res_flag); - column_info.is_nullable_ = false; - ASSERT_EQ(OB_BAD_NULL_ERROR, fake_ctx.adjust_column_type(column_info, obj)); - // check data type mismatch - res_flag = 0; - obj.set_int(1); - column_info.type_.set_result_flag(res_flag); - column_info.type_.set_type(ObVarcharType); - ASSERT_EQ(OB_KV_COLUMN_TYPE_NOT_MATCH, fake_ctx.adjust_column_type(column_info, obj)); - // check collation - obj.set_binary("ttt"); - column_info.type_.set_collation_type(CS_TYPE_UTF8MB4_GENERAL_CI); - ASSERT_EQ(OB_KV_COLLATION_MISMATCH, fake_ctx.adjust_column_type(column_info, obj)); - // collation convert - obj.set_varchar("test"); - obj.set_collation_type(CS_TYPE_UTF8MB4_BIN); - ASSERT_EQ(OB_SUCCESS, fake_ctx.adjust_column_type(column_info, obj)); - ASSERT_EQ(CS_TYPE_UTF8MB4_GENERAL_CI, obj.get_collation_type()); -} - TEST_F(TestCreateExecutor, generate_key_range) { ObTableCtx fake_ctx(allocator_); @@ -580,6 +550,7 @@ TEST_F(TestCreateExecutor, test_cache) ASSERT_EQ(TABLE_API_EXEC_INSERT, spec->type_); } } +} // end namespace oceanbase int main(int argc, char **argv) {