diff --git a/be/src/storage/lake/tablet_manager.cpp b/be/src/storage/lake/tablet_manager.cpp index a91e0a82b84d36..b4cc4960aa4804 100644 --- a/be/src/storage/lake/tablet_manager.cpp +++ b/be/src/storage/lake/tablet_manager.cpp @@ -682,29 +682,37 @@ StatusOr TabletManager::load_segment(const FileInfo& segment_info, i StatusOr TabletManager::capture_tablet_and_rowsets(int64_t tablet_id, int64_t from_version, int64_t to_version) { auto tablet_ptr = std::make_shared(this, tablet_id); - std::vector> rowsets; std::vector from_rowsets; std::vector to_rowsets; - if (from_version != 0) { - auto tablet_meta_from_version = get_tablet_metadata(tablet_id, from_version).value(); - from_rowsets = Rowset::get_rowsets(this, tablet_meta_from_version); - } - auto tablet_meta_to_version = get_tablet_metadata(tablet_id, to_version).value(); - to_rowsets = Rowset::get_rowsets(this, tablet_meta_to_version); + for (int version = from_version + 1; version <= to_version; version++) { + auto current_version_tablet_meta = get_tablet_metadata(tablet_id, version).value(); + if (current_version_tablet_meta->compaction_inputs_size() == 0) { + std::set rowset_ids; + // indicates the tablet metadata is generated by load + if (version != 1) { + auto pre_version_tablet_meta = get_tablet_metadata(tablet_id, version - 1); + if (!pre_version_tablet_meta.ok()) { - std::unordered_map> distinct_rowset; - for (const auto& rowset : from_rowsets) { - distinct_rowset[rowset->id()] = std::move(rowset); - } + } + + auto pre_tablet_meta = pre_version_tablet_meta.value(); + for (int i = 0, size = pre_tablet_meta->rowsets_size(); i < size; ++i) { + rowset_ids.emplace(pre_tablet_meta->rowsets(i).id()); + } + } - for (const auto& rowset : to_rowsets) { - if (distinct_rowset.find(rowset->id()) != distinct_rowset.end()) { - auto base_rowset_ptr = std::static_pointer_cast(rowset); - rowsets.emplace_back(base_rowset_ptr); + for (int i = 0, size = current_version_tablet_meta->rowsets_size(); i < size; i++) { + if (rowset_ids.count(current_version_tablet_meta->rowsets(i).id()) == 0) { + // inc rowset + auto rowset = std::make_shared(this, current_version_tablet_meta, i); + rowsets.emplace_back(std::static_pointer_cast(rowset)); + } + } } + } return std::make_tuple(std::move(tablet_ptr), std::move(rowsets));