[CP] [to #2024120400105980661]bugFix memory leak when ObPLRecord::init_data failed

This commit is contained in:
seuwebber 2024-12-18 02:48:08 +00:00 committed by ob-robot
parent 4853f2eb8b
commit 8b85852805
3 changed files with 39 additions and 27 deletions

View File

@ -2336,6 +2336,7 @@ int ObMySQLProcStatement::process_array_out_param(const pl::ObCollectionType *co
OZ (pl::ObUserDefinedType::destruct_obj(param, nullptr, true));
CK (OB_NOT_NULL(coll = reinterpret_cast<pl::ObPLCollection*>(param.get_ext())));
OX (coll->set_count(0));
LOG_INFO("coll allocator is", K(coll->get_allocator()), K(ret));
} else {
// 原来无值,重新分配内存
int64_t init_size = 0;
@ -2442,7 +2443,10 @@ int ObMySQLProcStatement::process_array_out_param(const pl::ObCollectionType *co
coll->set_last(array_size);
} else if (NULL != new_data) {
for (int64_t j = 0; j < i; j++) {
pl::ObUserDefinedType::destruct_objparam(*local_allocator, new_data[j]);
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = pl::ObUserDefinedType::destruct_objparam(*local_allocator, new_data[j]))) {
LOG_WARN("dblink destruct_objparam failed", K(ret), K(tmp_ret));
}
}
local_allocator->free(new_data);
}
@ -2492,27 +2496,32 @@ int ObMySQLProcStatement::process_array_out_param(const pl::ObCollectionType *co
ObObj *element = NULL;
new(ptr)pl::ObPLRecord(record_type->get_user_type_id(), record_type->get_member_count());
OZ (record->init_data(*local_allocator, false));
CK (record->get_allocator());
for (int64_t j = 0; OB_SUCC(ret) && j < record_type->get_member_count(); ++j) {
CK (OB_NOT_NULL(record_type->get_record_member_type(j)));
OZ (record->get_element(j, element));
CK (OB_NOT_NULL(element));
CK (record_type->get_record_member_type(j)->is_obj_type());
OX (new (element) ObObj(ObNullType));
if (OB_SUCC(ret)) {
CK (start_idx + j < com_data.get_data_array().count());
CK (OB_NOT_NULL(bind_param = com_data.get_data_array().at(start_idx + j)));
CK (MYSQL_TYPE_OBJECT == bind_param->buffer_type_);
CK (OB_NOT_NULL(pl_array = (MYSQL_COMPLEX_BIND_ARRAY *)bind_param->buffer_));
OX (element->set_meta_type(*(record_type->get_record_member_type(j)->get_meta_type())));
OZ (process_array_element(i, *(record->get_allocator()), pl_array->buffer, *element, tz_info));
}
} // end for
}
if (NULL != ptr) {
current_obj->set_extend(reinterpret_cast<int64_t>(ptr), pl::PL_RECORD_TYPE, init_size);
if (OB_FAIL(ret)) {
pl::ObUserDefinedType::destruct_objparam(*local_allocator, *current_obj);
local_allocator->free(ptr);
} else {
CK (record->get_allocator());
for (int64_t j = 0; OB_SUCC(ret) && j < record_type->get_member_count(); ++j) {
CK (OB_NOT_NULL(record_type->get_record_member_type(j)));
OZ (record->get_element(j, element));
CK (OB_NOT_NULL(element));
CK (record_type->get_record_member_type(j)->is_obj_type());
OX (new (element) ObObj(ObNullType));
if (OB_SUCC(ret)) {
CK (start_idx + j < com_data.get_data_array().count());
CK (OB_NOT_NULL(bind_param = com_data.get_data_array().at(start_idx + j)));
CK (MYSQL_TYPE_OBJECT == bind_param->buffer_type_);
CK (OB_NOT_NULL(pl_array = (MYSQL_COMPLEX_BIND_ARRAY *)bind_param->buffer_));
OX (element->set_meta_type(*(record_type->get_record_member_type(j)->get_meta_type())));
OZ (process_array_element(i, *(record->get_allocator()), pl_array->buffer, *element, tz_info));
}
} // end for
current_obj->set_extend(reinterpret_cast<int64_t>(ptr), pl::PL_RECORD_TYPE, init_size);
if (OB_FAIL(ret)) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = pl::ObUserDefinedType::destruct_objparam(*local_allocator, *current_obj))) {
LOG_WARN("dblink destruct_objparam failed", K(ret), K(tmp_ret));
}
}
}
}
}
@ -2524,7 +2533,10 @@ int ObMySQLProcStatement::process_array_out_param(const pl::ObCollectionType *co
coll->set_last(array_size);
} else if (NULL != new_data) {
for (int64_t j = 0; j < i; j++) {
pl::ObUserDefinedType::destruct_objparam(*local_allocator, new_data[j]);
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = pl::ObUserDefinedType::destruct_objparam(*local_allocator, new_data[j]))) {
LOG_WARN("dblink destruct_objparam failed", K(ret), K(tmp_ret));
}
}
local_allocator->free(new_data);
}

View File

@ -283,7 +283,7 @@ int ObUserDefinedType::destruct_objparam(ObIAllocator &alloc, ObObj &src, ObSQLS
ObPLComposite *composite = reinterpret_cast<ObPLComposite*>(src.get_ext());
if (direct_use_alloc) {
ObIAllocator *allocator = nullptr;
CK (OB_NOT_NULL(composite));
OV (OB_NOT_NULL(composite), OB_ERR_UNEXPECTED, lbt());
OX (allocator = composite->get_allocator());
OZ (SMART_CALL(ObUserDefinedType::destruct_obj(src, session)));
if (OB_SUCC(ret) && OB_NOT_NULL(allocator)) {
@ -292,8 +292,8 @@ int ObUserDefinedType::destruct_objparam(ObIAllocator &alloc, ObObj &src, ObSQLS
}
OX (alloc.free(composite));
} else {
CK (OB_NOT_NULL(composite));
CK (OB_NOT_NULL(composite->get_allocator()));
OV (OB_NOT_NULL(composite), OB_ERR_UNEXPECTED, lbt());
OV (OB_NOT_NULL(composite->get_allocator()), OB_ERR_UNEXPECTED, lbt());
OX (pl_allocator = dynamic_cast<ObPLAllocator1 *>(composite->get_allocator()));
CK (OB_NOT_NULL(pl_allocator));
CK (OB_NOT_NULL(parent_allocator = pl_allocator->get_parent_allocator()));

View File

@ -9075,7 +9075,7 @@ int ObSPIService::spi_execute_dblink(ObExecContext &exec_ctx,
if (exec_params.at(i).is_pl_extend()) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = ObUserDefinedType::destruct_obj(exec_params.at(i)))) {
LOG_WARN("destruct obj failed", K(ret), K(exec_params.at(i)));
LOG_WARN("destruct obj failed", K(ret), K(tmp_ret), K(exec_params.at(i)));
}
}
}
@ -9083,7 +9083,7 @@ int ObSPIService::spi_execute_dblink(ObExecContext &exec_ctx,
&& ob_is_extend(routine_info->get_ret_type()->get_obj_type())) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = ObUserDefinedType::destruct_obj(tmp_result))) {
LOG_WARN("destruct obj failed", K(ret), K(tmp_result));
LOG_WARN("destruct obj failed", K(ret), K(tmp_ret), K(tmp_result));
}
}
if (OB_SUCC(ret) && NULL != result && !result->is_null() && result->is_ext()) {