Add defense for abnormal path of MicroBlockDecoder::acquire()
This commit is contained in:
@ -767,16 +767,25 @@ int ObMicroBlockCSDecoder::acquire(
|
||||
int ObMicroBlockCSDecoder::acquire(const int64_t store_idx, const ObIColumnCSDecoder *&decoder)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
decoder = nullptr;
|
||||
const ObCSColumnHeader &col_header = transform_helper_.get_column_header(store_idx);
|
||||
if (NULL != cached_decoder_ && store_idx < cached_decoder_->count_) {
|
||||
decoder = &cached_decoder_->at(store_idx);
|
||||
} else if (OB_FAIL(acquire_local_funcs_[(ObCSColumnHeader::Type)col_header.type_](
|
||||
*local_decoder_pool_, decoder))) {
|
||||
LOG_WARN("acquire decoder failed", K(ret), K(store_idx), K(col_header));
|
||||
} else if (OB_FAIL(need_release_decoders_.push_back(decoder))) {
|
||||
LOG_WARN("add decoder failed", K(ret), K(store_idx), K(col_header));
|
||||
} else {
|
||||
++need_release_decoder_cnt_;
|
||||
if (OB_FAIL(acquire_local_funcs_[(ObCSColumnHeader::Type)col_header.type_](
|
||||
*local_decoder_pool_, decoder))) {
|
||||
LOG_WARN("acquire decoder failed", K(ret), K(store_idx), K(col_header));
|
||||
} else if (OB_FAIL(need_release_decoders_.push_back(decoder))) {
|
||||
LOG_WARN("add decoder failed", K(ret), K(store_idx), K(col_header));
|
||||
} else {
|
||||
++need_release_decoder_cnt_;
|
||||
}
|
||||
|
||||
if (OB_FAIL(ret) && decoder != nullptr) {
|
||||
release_local_funcs_[decoder->get_type()]
|
||||
(*local_decoder_pool_, const_cast<ObIColumnCSDecoder *>(decoder));
|
||||
decoder = nullptr;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -1036,6 +1036,7 @@ int ObMicroBlockDecoder::acquire(
|
||||
int ObMicroBlockDecoder::acquire(const int64_t store_idx, const ObIColumnDecoder *&decoder)
|
||||
{
|
||||
int ret = OB_SUCCESS;
|
||||
decoder = nullptr;
|
||||
if (NULL != cached_decoder_ && store_idx < cached_decoder_->count_) {
|
||||
decoder = &cached_decoder_->at(store_idx);
|
||||
} else {
|
||||
@ -1048,6 +1049,12 @@ int ObMicroBlockDecoder::acquire(const int64_t store_idx, const ObIColumnDecoder
|
||||
} else {
|
||||
++need_release_decoder_cnt_;
|
||||
}
|
||||
|
||||
if (OB_FAIL(ret) && decoder != nullptr) {
|
||||
release_local_funcs_[decoder->get_type()]
|
||||
(*local_decoder_pool_, const_cast<ObIColumnDecoder *>(decoder));
|
||||
decoder = nullptr;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user