diff --git a/src/storage/lob/ob_lob_manager.cpp b/src/storage/lob/ob_lob_manager.cpp index 19b8f24e4e..e44fea4d10 100644 --- a/src/storage/lob/ob_lob_manager.cpp +++ b/src/storage/lob/ob_lob_manager.cpp @@ -637,6 +637,7 @@ static int read_all( int ret = OB_SUCCESS; ObLobQueryResult result; meta_iter.set_not_calc_char_len(true); + meta_iter.set_not_need_last_info(true); while (OB_SUCC(ret)) { ret = meta_iter.get_next_row(result.meta_result_); const char *lob_data = result.meta_result_.info_.lob_data_.ptr(); @@ -3821,6 +3822,7 @@ int ObLobManager::batch_delete(ObLobAccessParam& param, ObLobMetaScanIter &meta_ int ret = OB_SUCCESS; ObLobQueryResult result; meta_iter.set_not_calc_char_len(true); + meta_iter.set_not_need_last_info(true); while (OB_SUCC(ret)) { if (OB_FAIL(meta_iter.get_next_row(result.meta_result_))) { if (ret == OB_ITER_END) { diff --git a/src/storage/lob/ob_lob_meta.cpp b/src/storage/lob/ob_lob_meta.cpp index d3378e9757..0729cc48ca 100644 --- a/src/storage/lob/ob_lob_meta.cpp +++ b/src/storage/lob/ob_lob_meta.cpp @@ -39,7 +39,8 @@ int ObLobMetaScanIter::open(ObLobAccessParam ¶m, ObILobApator* lob_adatper) } ObLobMetaScanIter::ObLobMetaScanIter() - : lob_adatper_(nullptr), meta_iter_(nullptr), param_(), scan_param_(), cur_pos_(0), cur_byte_pos_(0), not_calc_char_len_(false) {} + : lob_adatper_(nullptr), meta_iter_(nullptr), param_(), scan_param_(), cur_pos_(0), cur_byte_pos_(0), not_calc_char_len_(false), + not_need_last_info_(false) {} int ObLobMetaScanIter::get_next_row(ObLobMetaInfo &row) { @@ -63,11 +64,6 @@ int ObLobMetaScanIter::get_next_row(ObLobMetaInfo &row) row.byte_len_ = 0; row.char_len_ = 0; row.seq_id_ = ObString(); - // when get iter end, do deep copy for last scan result - int tmp_ret = cur_info_.deep_copy(*param_.allocator_, cur_info_); - if (tmp_ret != OB_SUCCESS) { - LOG_WARN("fail to do deep copy for cur info", K(tmp_ret), K(cur_info_)); - } } else { LOG_WARN("failed to get next row.", K(ret)); } @@ -103,6 +99,14 @@ int ObLobMetaScanIter::get_next_row(ObLobMetaInfo &row) // update sum(len) cur_pos_ += (is_char) ? row.char_len_ : row.byte_len_; cur_byte_pos_ += row.byte_len_; + if (OB_SUCC(ret) && ! not_need_last_info() && cur_byte_pos_ == param_.byte_size_) { + ObLobMetaInfo info = cur_info_; + if (OB_FAIL(cur_info_.deep_copy(*param_.allocator_, info))) { + LOG_WARN("fail to do deep copy for cur info", K(info), K(row), K(param_), KPC(this)); + } else { + LOG_DEBUG("deep_copy last info", K(cur_info_), K(param_)); + } + } } } } diff --git a/src/storage/lob/ob_lob_meta.h b/src/storage/lob/ob_lob_meta.h index d1478711e7..290b6b67ac 100644 --- a/src/storage/lob/ob_lob_meta.h +++ b/src/storage/lob/ob_lob_meta.h @@ -85,7 +85,9 @@ public: bool is_range_over(const ObLobMetaInfo& info); void set_not_calc_char_len(bool not_calc_char_len) { not_calc_char_len_ = not_calc_char_len; } bool not_calc_char_len() const { return not_calc_char_len_; } - TO_STRING_KV(K_(cur_pos), K_(cur_byte_pos), K_(cur_info), K_(not_calc_char_len)); + void set_not_need_last_info(bool not_need_last_info) { not_need_last_info_ = not_need_last_info;} + bool not_need_last_info() const { return not_need_last_info_; } + TO_STRING_KV(K_(cur_pos), K_(cur_byte_pos), K_(cur_info), K_(not_calc_char_len), K_(not_need_last_info)); private: bool is_in_range(const ObLobMetaInfo& info); private: @@ -97,6 +99,7 @@ private: uint64_t cur_byte_pos_; ObLobMetaInfo cur_info_; bool not_calc_char_len_; + bool not_need_last_info_; }; struct ObLobMetaWriteResult {