diff --git a/src/storage/blocksstable/cs_encoding/ob_micro_block_cs_decoder.cpp b/src/storage/blocksstable/cs_encoding/ob_micro_block_cs_decoder.cpp index 4a21d49293..e77d065190 100644 --- a/src/storage/blocksstable/cs_encoding/ob_micro_block_cs_decoder.cpp +++ b/src/storage/blocksstable/cs_encoding/ob_micro_block_cs_decoder.cpp @@ -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(decoder)); + decoder = nullptr; + } } return ret; } diff --git a/src/storage/blocksstable/encoding/ob_micro_block_decoder.cpp b/src/storage/blocksstable/encoding/ob_micro_block_decoder.cpp index a85326fb28..7b7a7471cd 100644 --- a/src/storage/blocksstable/encoding/ob_micro_block_decoder.cpp +++ b/src/storage/blocksstable/encoding/ob_micro_block_decoder.cpp @@ -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(decoder)); + decoder = nullptr; + } } return ret; }