This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new 237adc2659b [fix](warmup) avoid calling recycle_cache after rebalance 
(#53339) (#53523)
237adc2659b is described below

commit 237adc2659b56b113af8e70c69410d194f51f9c4
Author: Kaijie Chen <[email protected]>
AuthorDate: Mon Jul 21 19:58:45 2025 +0800

    [fix](warmup) avoid calling recycle_cache after rebalance (#53339) (#53523)
    
    backport #53339
---
 be/src/cloud/cloud_tablet.cpp          | 74 +++++++++++++++++-----------------
 be/src/cloud/cloud_tablet.h            |  9 ++++-
 be/src/cloud/cloud_warm_up_manager.cpp | 26 +++++-------
 be/src/cloud/cloud_warm_up_manager.h   |  5 +--
 4 files changed, 57 insertions(+), 57 deletions(-)

diff --git a/be/src/cloud/cloud_tablet.cpp b/be/src/cloud/cloud_tablet.cpp
index e4c62c592f0..f96f2a9deb7 100644
--- a/be/src/cloud/cloud_tablet.cpp
+++ b/be/src/cloud/cloud_tablet.cpp
@@ -491,7 +491,11 @@ uint64_t CloudTablet::delete_expired_stale_rowsets() {
         _reconstruct_version_tracker_if_necessary();
     }
     
_tablet_meta->delete_bitmap()->remove_stale_delete_bitmap_from_queue(version_to_delete);
-    recycle_cached_data(expired_rowsets);
+    auto recycled_rowsets = recycle_cached_data(expired_rowsets);
+    if (!recycled_rowsets.empty()) {
+        auto& manager = 
ExecEnv::GetInstance()->storage_engine().to_cloud().cloud_warm_up_manager();
+        manager.recycle_cache(tablet_id(), recycled_rowsets);
+    }
     if (config::enable_mow_verbose_log) {
         LOG_INFO("finish delete_expired_stale_rowset for tablet={}", 
tablet_id());
     }
@@ -535,33 +539,31 @@ void CloudTablet::remove_unused_rowsets() {
         }
     }
 
-    std::vector<RowsetId> rowset_ids;
-    std::vector<int64_t> num_segments;
-    std::vector<std::vector<std::string>> index_file_names;
+    {
+        std::vector<RecycledRowsets> recycled_rowsets;
+
+        for (auto& rs : removed_rowsets) {
+            auto index_names = rs->get_index_file_names();
+            recycled_rowsets.emplace_back(rs->rowset_id(), rs->num_segments(), 
index_names);
+            int64_t segment_size_sum = 0;
+            for (int32_t i = 0; i < rs->num_segments(); i++) {
+                segment_size_sum += rs->rowset_meta()->segment_file_size(i);
+            }
+            g_file_cache_recycle_cached_data_segment_num << rs->num_segments();
+            g_file_cache_recycle_cached_data_segment_size << segment_size_sum;
+            g_file_cache_recycle_cached_data_index_num << index_names.size();
+        }
 
-    for (auto& rs : removed_rowsets) {
-        rowset_ids.push_back(rs->rowset_id());
-        num_segments.push_back(rs->num_segments());
-        auto index_names = rs->get_index_file_names();
-        index_file_names.push_back(index_names);
-        int64_t segment_size_sum = 0;
-        for (int32_t i = 0; i < rs->num_segments(); i++) {
-            segment_size_sum += rs->rowset_meta()->segment_file_size(i);
+        if (recycled_rowsets.size() > 0) {
+            auto& manager =
+                    
ExecEnv::GetInstance()->storage_engine().to_cloud().cloud_warm_up_manager();
+            manager.recycle_cache(tablet_id(), recycled_rowsets);
         }
-        g_file_cache_recycle_cached_data_segment_num << rs->num_segments();
-        g_file_cache_recycle_cached_data_segment_size << segment_size_sum;
-        g_file_cache_recycle_cached_data_index_num << index_names.size();
     }
 
-    if (removed_rowsets.size() > 0) {
-        auto& manager = 
ExecEnv::GetInstance()->storage_engine().to_cloud().cloud_warm_up_manager();
-        manager.recycle_cache(tablet_id(), rowset_ids, num_segments, 
index_file_names);
-
-        LOG(INFO) << "tablet_id=" << tablet_id()
-                  << ", unused_rowset size=" << _unused_rowsets.size()
-                  << ", removed_rowsets_num=" << removed_rowsets.size()
-                  << ", cost(us)=" << watch.get_elapse_time_us();
-    }
+    LOG(INFO) << "tablet_id=" << tablet_id() << ", unused_rowset size=" << 
_unused_rowsets.size()
+              << ", removed_rowsets_num=" << removed_rowsets.size()
+              << ", cost(us)=" << watch.get_elapse_time_us();
 }
 
 void CloudTablet::update_base_size(const Rowset& rs) {
@@ -572,14 +574,17 @@ void CloudTablet::update_base_size(const Rowset& rs) {
 }
 
 void CloudTablet::clear_cache() {
-    CloudTablet::recycle_cached_data(get_snapshot_rowset(true));
+    auto recycled_rowsets = 
CloudTablet::recycle_cached_data(get_snapshot_rowset(true));
+    if (!recycled_rowsets.empty()) {
+        auto& manager = 
ExecEnv::GetInstance()->storage_engine().to_cloud().cloud_warm_up_manager();
+        manager.recycle_cache(tablet_id(), recycled_rowsets);
+    }
     _engine.tablet_mgr().erase_tablet(tablet_id());
 }
 
-void CloudTablet::recycle_cached_data(const std::vector<RowsetSharedPtr>& 
rowsets) {
-    std::vector<RowsetId> rowset_ids;
-    std::vector<int64_t> num_segments;
-    std::vector<std::vector<std::string>> index_file_names;
+std::vector<RecycledRowsets> CloudTablet::recycle_cached_data(
+        const std::vector<RowsetSharedPtr>& rowsets) {
+    std::vector<RecycledRowsets> recycled_rowsets;
     for (const auto& rs : rowsets) {
         // rowsets and tablet._rs_version_map each hold a rowset shared_ptr, 
so at this point, the reference count of the shared_ptr is at least 2.
         if (rs.use_count() > 2) {
@@ -588,10 +593,9 @@ void CloudTablet::recycle_cached_data(const 
std::vector<RowsetSharedPtr>& rowset
             continue;
         }
         rs->clear_cache();
-        rowset_ids.push_back(rs->rowset_id());
-        num_segments.push_back(rs->num_segments());
         auto index_names = rs->get_index_file_names();
-        index_file_names.push_back(index_names);
+        recycled_rowsets.emplace_back(rs->rowset_id(), rs->num_segments(), 
index_names);
+
         int64_t segment_size_sum = 0;
         for (int32_t i = 0; i < rs->num_segments(); i++) {
             segment_size_sum += rs->rowset_meta()->segment_file_size(i);
@@ -600,11 +604,7 @@ void CloudTablet::recycle_cached_data(const 
std::vector<RowsetSharedPtr>& rowset
         g_file_cache_recycle_cached_data_segment_size << segment_size_sum;
         g_file_cache_recycle_cached_data_index_num << index_names.size();
     }
-    if (!rowsets.empty()) {
-        auto& manager = 
ExecEnv::GetInstance()->storage_engine().to_cloud().cloud_warm_up_manager();
-        manager.recycle_cache(rowsets.front()->rowset_meta()->tablet_id(), 
rowset_ids, num_segments,
-                              index_file_names);
-    }
+    return recycled_rowsets;
 }
 
 void CloudTablet::reset_approximate_stats(int64_t num_rowsets, int64_t 
num_segments,
diff --git a/be/src/cloud/cloud_tablet.h b/be/src/cloud/cloud_tablet.h
index df573314938..d1ea7dec379 100644
--- a/be/src/cloud/cloud_tablet.h
+++ b/be/src/cloud/cloud_tablet.h
@@ -41,6 +41,12 @@ struct SyncRowsetStats {
     int64_t tablet_meta_cache_miss {0};
 };
 
+struct RecycledRowsets {
+    RowsetId rowset_id;
+    int64_t num_segments;
+    std::vector<std::string> index_file_names;
+};
+
 class CloudTablet final : public BaseTablet {
 public:
     CloudTablet(CloudStorageEngine& engine, TabletMetaSharedPtr tablet_meta);
@@ -267,7 +273,8 @@ public:
     void add_unused_rowsets(const std::vector<RowsetSharedPtr>& rowsets);
     void remove_unused_rowsets();
 
-    static void recycle_cached_data(const std::vector<RowsetSharedPtr>& 
rowsets);
+    static std::vector<RecycledRowsets> recycle_cached_data(
+            const std::vector<RowsetSharedPtr>& rowsets);
 
 private:
     // FIXME(plat1ko): No need to record base size if rowsets are ordered by 
version
diff --git a/be/src/cloud/cloud_warm_up_manager.cpp 
b/be/src/cloud/cloud_warm_up_manager.cpp
index f270ee5ff78..f9a256d2b97 100644
--- a/be/src/cloud/cloud_warm_up_manager.cpp
+++ b/be/src/cloud/cloud_warm_up_manager.cpp
@@ -583,36 +583,30 @@ void CloudWarmUpManager::warm_up_rowset(RowsetMeta& 
rs_meta) {
     }
 }
 
-void CloudWarmUpManager::recycle_cache(
-        int64_t tablet_id, const std::vector<RowsetId>& rowset_ids,
-        const std::vector<int64_t>& num_segments,
-        const std::vector<std::vector<std::string>>& index_file_names) {
-    LOG(INFO) << "recycle_cache: tablet_id=" << tablet_id << ", num_rowsets=" 
<< rowset_ids.size();
+void CloudWarmUpManager::recycle_cache(int64_t tablet_id,
+                                       const std::vector<RecycledRowsets>& 
rowsets) {
+    LOG(INFO) << "recycle_cache: tablet_id=" << tablet_id << ", num_rowsets=" 
<< rowsets.size();
     auto replicas = get_replica_info(tablet_id);
     if (replicas.empty()) {
         return;
     }
-    if (rowset_ids.size() != num_segments.size()) {
-        LOG(WARNING) << "recycle_cache: rowset_ids size mismatch with 
num_segments";
-        return;
-    }
 
     PRecycleCacheRequest request;
-    for (int i = 0; i < rowset_ids.size(); i++) {
+    for (const auto& rowset : rowsets) {
         RecycleCacheMeta* meta = request.add_cache_metas();
         meta->set_tablet_id(tablet_id);
-        meta->set_rowset_id(rowset_ids[i].to_string());
-        meta->set_num_segments(num_segments[i]);
-        for (const auto& name : index_file_names[i]) {
+        meta->set_rowset_id(rowset.rowset_id.to_string());
+        meta->set_num_segments(rowset.num_segments);
+        for (const auto& name : rowset.index_file_names) {
             meta->add_index_file_names(name);
         }
-        g_file_cache_recycle_cache_requested_segment_num << num_segments[i];
-        g_file_cache_recycle_cache_requested_index_num << 
index_file_names[i].size();
+        g_file_cache_recycle_cache_requested_segment_num << 
rowset.num_segments;
+        g_file_cache_recycle_cache_requested_index_num << 
rowset.index_file_names.size();
     }
+    auto dns_cache = ExecEnv::GetInstance()->dns_cache();
     for (auto& replica : replicas) {
         // send sync request
         std::string host = replica.host;
-        auto dns_cache = ExecEnv::GetInstance()->dns_cache();
         if (dns_cache == nullptr) {
             LOG(WARNING) << "DNS cache is not initialized, skipping hostname 
resolve";
         } else if (!is_valid_ip(replica.host)) {
diff --git a/be/src/cloud/cloud_warm_up_manager.h 
b/be/src/cloud/cloud_warm_up_manager.h
index 13ba906a4e5..6feef0e9d42 100644
--- a/be/src/cloud/cloud_warm_up_manager.h
+++ b/be/src/cloud/cloud_warm_up_manager.h
@@ -27,6 +27,7 @@
 #include <vector>
 
 #include "cloud/cloud_storage_engine.h"
+#include "cloud/cloud_tablet.h"
 #include "common/status.h"
 #include "gen_cpp/BackendService.h"
 
@@ -73,9 +74,7 @@ public:
 
     void warm_up_rowset(RowsetMeta& rs_meta);
 
-    void recycle_cache(int64_t tablet_id, const std::vector<RowsetId>& 
rowset_ids,
-                       const std::vector<int64_t>& num_segments,
-                       const std::vector<std::vector<std::string>>& 
index_file_names);
+    void recycle_cache(int64_t tablet_id, const std::vector<RecycledRowsets>& 
rowsets);
 
 private:
     void handle_jobs();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to