diff --git a/src/storage/access/ob_multiple_merge.cpp b/src/storage/access/ob_multiple_merge.cpp index bcb285751820659175237e013f43ff1bfc259022..a2f7e8388c377a98366ea0a0142a182a7dabb4fe 100644 --- a/src/storage/access/ob_multiple_merge.cpp +++ b/src/storage/access/ob_multiple_merge.cpp @@ -325,6 +325,7 @@ int ObMultipleMerge::get_next_row(ObDatumRow *&row) if (need_padding_) { padding_allocator_.reuse(); } + reuse_lob_locator(); while (OB_SUCC(ret)) { if (access_ctx_->is_limit_end()) { ret = OB_ITER_END; @@ -448,6 +449,7 @@ int ObMultipleMerge::get_next_normal_rows(int64_t &count, int64_t capacity) if (need_padding_) { padding_allocator_.reuse(); } + reuse_lob_locator(); while (OB_SUCC(ret) && !vector_store->is_end()) { bool can_batch = false; if (access_ctx_->is_limit_end()) { @@ -552,6 +554,7 @@ int ObMultipleMerge::get_next_aggregate_row(ObDatumRow *&row) int64_t batch_size = max(1, access_param_->op_->get_batch_size()); access_param_->op_->get_eval_ctx().reuse(batch_size); } + reuse_lob_locator(); while (OB_SUCC(ret) && !agg_row_store->is_end()) { bool can_batch = false; // clear evaluated flag for every row @@ -1298,7 +1301,6 @@ int ObMultipleMerge::read_lob_columns_full_data(blocksstable::ObDatumRow &row) ret = OB_ERR_UNEXPECTED; LOG_WARN("Invalid col count", K(row), KPC(out_cols_param)); } else { - lob_reader_.reuse(); for (int64_t i = 0; OB_SUCC(ret) && i < row.count_; ++i) { blocksstable::ObStorageDatum &datum = row.storage_datums_[i]; if (out_cols_param->at(i)->get_meta_type().is_lob_storage()) { @@ -1375,5 +1377,14 @@ int ObMultipleMerge::fuse_lob_default(ObObj &def_cell, const uint64_t col_id) } return ret; } + +void ObMultipleMerge::reuse_lob_locator() +{ + if (NULL != access_ctx_->lob_locator_helper_) { + access_ctx_->lob_locator_helper_->reuse(); + } + lob_reader_.reuse(); +} + } } diff --git a/src/storage/access/ob_multiple_merge.h b/src/storage/access/ob_multiple_merge.h index fc4e4789e69dea26a025fad792d6a40975d4b286..a4cdac0a00a97486405106d02735070dd8ed1a67 100644 --- a/src/storage/access/ob_multiple_merge.h +++ b/src/storage/access/ob_multiple_merge.h @@ -112,6 +112,7 @@ private: int read_lob_columns_full_data(blocksstable::ObDatumRow &row); bool need_read_lob_columns(const blocksstable::ObDatumRow &row); int handle_lob_before_fuse_row(); + void reuse_lob_locator(); void report_tablet_stat(); OB_INLINE int update_and_report_tablet_stat(); diff --git a/src/storage/lob/ob_lob_locator.cpp b/src/storage/lob/ob_lob_locator.cpp index 738b81daaf1066dd9f36df679df9b6c331ac0974..ad750b104377cd2d7a7405cf48d4c1ff45efc77e 100644 --- a/src/storage/lob/ob_lob_locator.cpp +++ b/src/storage/lob/ob_lob_locator.cpp @@ -171,7 +171,6 @@ int ObLobLocatorHelper::fill_lob_locator(ObDatumRow &row, } else { STORAGE_LOG(DEBUG, "start to fill lob locator", K(row)); //ObLobLocatorHelper is inited, we always cound find a lob cell in projected row - locator_allocator_.reuse(); if (OB_FAIL(build_rowid_obj(row, rowkey_str_, is_projected_row, *col_descs, *out_project, access_param.iter_param_.tablet_id_))) { @@ -236,7 +235,6 @@ int ObLobLocatorHelper::fill_lob_locator_v2(ObDatumRow &row, ret = OB_ERR_UNEXPECTED; LOG_WARN("Invalid col count", K(row), KPC(out_cols_param)); } else { - locator_allocator_.reuse(); if (OB_FAIL(build_rowid_obj(row, rowkey_str_, false, *col_descs, *out_project, access_param.iter_param_.tablet_id_))) { STORAGE_LOG(WARN, "Failed to build rowid obj", K(ret), K(rowkey_str_)); } else { diff --git a/src/storage/lob/ob_lob_locator.h b/src/storage/lob/ob_lob_locator.h index 9990769b5bc29fd1e1bb8e9e3512761dc9ea89a3..3547146102eec60330bd1ce3a4d28bbb392c0643 100644 --- a/src/storage/lob/ob_lob_locator.h +++ b/src/storage/lob/ob_lob_locator.h @@ -27,6 +27,7 @@ public: ObLobLocatorHelper(); virtual ~ObLobLocatorHelper(); void reset(); + void reuse() { locator_allocator_.reuse(); } int init(const ObTableScanParam &scan_param, const ObStoreCtx &ctx, const share::ObLSID &ls_id, diff --git a/src/storage/lob/ob_lob_manager.cpp b/src/storage/lob/ob_lob_manager.cpp index 09911db0f8600318dfac3ce8083d4d5c50d03678..6294607ffd99834451fea81c3de9e5046a4ae737 100644 --- a/src/storage/lob/ob_lob_manager.cpp +++ b/src/storage/lob/ob_lob_manager.cpp @@ -481,6 +481,9 @@ int ObLobManager::query_remote(ObLobAccessParam& param, common::ObAddr& dst_addr } } } + if (ret == OB_ITER_END) { + ret = OB_SUCCESS; + } } } }