[Bugfix] fix coredump when kv & dblink
This commit is contained in:
parent
5aa0503125
commit
1691ed3528
@ -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<oceanbase::common::sqlclient::ObTenantDblinkKeeper *>();
|
||||
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;
|
||||
}
|
||||
|
@ -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)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user