Add defense for abnormal path of MicroBlockDecoder::acquire()

This commit is contained in:
Hooper9973
2023-11-22 10:10:41 +00:00
committed by ob-robot
parent b73c90536a
commit b9a890300d
2 changed files with 22 additions and 6 deletions

View File

@ -767,10 +767,12 @@ int ObMicroBlockCSDecoder::acquire(
int ObMicroBlockCSDecoder::acquire(const int64_t store_idx, const ObIColumnCSDecoder *&decoder) int ObMicroBlockCSDecoder::acquire(const int64_t store_idx, const ObIColumnCSDecoder *&decoder)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
decoder = nullptr;
const ObCSColumnHeader &col_header = transform_helper_.get_column_header(store_idx); const ObCSColumnHeader &col_header = transform_helper_.get_column_header(store_idx);
if (NULL != cached_decoder_ && store_idx < cached_decoder_->count_) { if (NULL != cached_decoder_ && store_idx < cached_decoder_->count_) {
decoder = &cached_decoder_->at(store_idx); decoder = &cached_decoder_->at(store_idx);
} else if (OB_FAIL(acquire_local_funcs_[(ObCSColumnHeader::Type)col_header.type_]( } else {
if (OB_FAIL(acquire_local_funcs_[(ObCSColumnHeader::Type)col_header.type_](
*local_decoder_pool_, decoder))) { *local_decoder_pool_, decoder))) {
LOG_WARN("acquire decoder failed", K(ret), K(store_idx), K(col_header)); LOG_WARN("acquire decoder failed", K(ret), K(store_idx), K(col_header));
} else if (OB_FAIL(need_release_decoders_.push_back(decoder))) { } else if (OB_FAIL(need_release_decoders_.push_back(decoder))) {
@ -778,6 +780,13 @@ int ObMicroBlockCSDecoder::acquire(const int64_t store_idx, const ObIColumnCSDec
} else { } else {
++need_release_decoder_cnt_; ++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; return ret;
} }

View File

@ -1036,6 +1036,7 @@ int ObMicroBlockDecoder::acquire(
int ObMicroBlockDecoder::acquire(const int64_t store_idx, const ObIColumnDecoder *&decoder) int ObMicroBlockDecoder::acquire(const int64_t store_idx, const ObIColumnDecoder *&decoder)
{ {
int ret = OB_SUCCESS; int ret = OB_SUCCESS;
decoder = nullptr;
if (NULL != cached_decoder_ && store_idx < cached_decoder_->count_) { if (NULL != cached_decoder_ && store_idx < cached_decoder_->count_) {
decoder = &cached_decoder_->at(store_idx); decoder = &cached_decoder_->at(store_idx);
} else { } else {
@ -1048,6 +1049,12 @@ int ObMicroBlockDecoder::acquire(const int64_t store_idx, const ObIColumnDecoder
} else { } else {
++need_release_decoder_cnt_; ++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; return ret;
} }