Repository: apache/doris
Pull request #50275: [enhancement](cloud) optimize warm up local IO and performance
Author: login: freemandealer
Labels: name: approved
description: Indicates a PR has been approved by one committer.
name: reviewed
name: usercase
description: Important user case type label
name: dev/3.0.6-merged
Created: 2025-04-22T03:19:38Z | Merged: 2025-04-29T02:40:03Z

Check whether the data exists based on the cache metadata. If it exists, there is no need to read from the local file, which enhances warm-up performance and reduces disk I/O load.

### What problem does this PR solve?

Issue Number: close #xxx

Related PR: #xxx

Problem Summary:

### Release note

None

### Check List (For Author)

- Test <!-- At least one of them must be included. -->
    - [x] Regression test
    - [x] Unit Test
    - [ ] Manual test (add detailed scripts or steps below)
    - [ ] No need to test or manual test. Explain why:
        - [ ] This is a refactor/code format and no logic has been changed.
        - [ ] Previous test can cover this change.
        - [ ] No code files have been changed.
        - [ ] Other reason <!-- Add your reason?  -->

- Behavior changed:
    - [x] No.
    - [ ] Yes. <!-- Explain the behavior change -->

- Does this need documentation?
    - [x] No.
    - [ ] Yes. <!-- Add document PR link here. eg: https://github.com/apache/doris-website/pull/1214 -->

### Check List (For Reviewer who merge this PR)

- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR should merge into -->




Diff:
diff --git a/be/src/cloud/cloud_tablet.cpp b/be/src/cloud/cloud_tablet.cpp
index 6708c7410b1a3d..e71a89c11fe4df 100644
--- a/be/src/cloud/cloud_tablet.cpp
+++ b/be/src/cloud/cloud_tablet.cpp
@@ -261,18 +261,18 @@ void CloudTablet::add_rowsets(std::vector<RowsetSharedPtr> to_add, bool version_
                                     ? 0
                                     : rowset_meta->newest_write_timestamp() +
                                               _tablet_meta->ttl_seconds();
-                    _engine.file_cache_block_downloader().submit_download_task(
-                            io::DownloadFileMeta {
-                                    .path = storage_resource.value()->remote_segment_path(
-                                            *rowset_meta, seg_id),
-                                    .file_size = rs->rowset_meta()->segment_file_size(seg_id),
-                                    .file_system = storage_resource.value()->fs,
-                                    .ctx =
-                                            {
-                                                    .expiration_time = expiration_time,
-                                            },
-                                    .download_done {},
-                            });
+                    // clang-format off
+                    _engine.file_cache_block_downloader().submit_download_task(io::DownloadFileMeta {
+                            .path = storage_resource.value()->remote_segment_path(*rowset_meta, seg_id),
+                            .file_size = rs->rowset_meta()->segment_file_size(seg_id),
+                            .file_system = storage_resource.value()->fs,
+                            .ctx =
+                                    {
+                                            .expiration_time = expiration_time,
+                                            .is_dryrun = config::enable_reader_dryrun_when_download_file_cache,
+                                    },
+                            .download_done {},
+                    });
 
                     auto download_idx_file = [&](const io::Path& idx_path) {
                         io::DownloadFileMeta meta {
@@ -282,11 +282,13 @@ void CloudTablet::add_rowsets(std::vector<RowsetSharedPtr> to_add, bool version_
                                 .ctx =
                                         {
                                                 .expiration_time = expiration_time,
+                                                .is_dryrun = config::enable_reader_dryrun_when_download_file_cache,
                                         },
                                 .download_done {},
                         };
                         _engine.file_cache_block_downloader().submit_download_task(std::move(meta));
                     };
+                    // clang-format on
                     auto schema_ptr = rowset_meta->tablet_schema();
                     auto idx_version = schema_ptr->get_inverted_index_storage_format();
                     if (idx_version == InvertedIndexStorageFormatPB::V1) {
diff --git a/be/src/cloud/cloud_warm_up_manager.cpp b/be/src/cloud/cloud_warm_up_manager.cpp
index 58b5711d997b4a..d8bce097465dde 100644
--- a/be/src/cloud/cloud_warm_up_manager.cpp
+++ b/be/src/cloud/cloud_warm_up_manager.cpp
@@ -113,24 +113,24 @@ void CloudWarmUpManager::handle_jobs() {
                     }
 
                     wait->add_count();
-                    _engine.file_cache_block_downloader().submit_download_task(
-                            io::DownloadFileMeta {
-                                    .path = storage_resource.value()->remote_segment_path(*rs,
-                                                                                          seg_id),
-                                    .file_size = rs->segment_file_size(seg_id),
-                                    .file_system = storage_resource.value()->fs,
-                                    .ctx =
-                                            {
-                                                    .expiration_time = expiration_time,
-                                            },
-                                    .download_done =
-                                            [wait](Status st) {
-                                                if (!st) {
-                                                    LOG_WARNING("Warm up error ").error(st);
-                                                }
-                                                wait->signal();
-                                            },
-                            });
+                    // clang-format off
+                    _engine.file_cache_block_downloader().submit_download_task(io::DownloadFileMeta {
+                            .path = storage_resource.value()->remote_segment_path(*rs, seg_id),
+                            .file_size = rs->segment_file_size(seg_id),
+                            .file_system = storage_resource.value()->fs,
+                            .ctx =
+                                    {
+                                            .expiration_time = expiration_time,
+                                            .is_dryrun = config::enable_reader_dryrun_when_download_file_cache,
+                                    },
+                            .download_done =
+                                    [wait](Status st) {
+                                        if (!st) {
+                                            LOG_WARNING("Warm up error ").error(st);
+                                        }
+                                        wait->signal();
+                                    },
+                    });
 
                     auto download_idx_file = [&](const io::Path& idx_path) {
                         io::DownloadFileMeta meta {
@@ -140,6 +140,7 @@ void CloudWarmUpManager::handle_jobs() {
                                 .ctx =
                                         {
                                                 .expiration_time = expiration_time,
+                                                .is_dryrun = config::enable_reader_dryrun_when_download_file_cache,
                                         },
                                 .download_done =
                                         [wait](Status st) {
@@ -149,6 +150,7 @@ void CloudWarmUpManager::handle_jobs() {
                                             wait->signal();
                                         },
                         };
+                        // clang-format on
                         _engine.file_cache_block_downloader().submit_download_task(std::move(meta));
                     };
                     auto schema_ptr = rs->tablet_schema();
diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp
index a41517176687da..78c2cc4c244805 100644
--- a/be/src/common/config.cpp
+++ b/be/src/common/config.cpp
@@ -1097,6 +1097,7 @@ DEFINE_mInt64(cache_lock_held_long_tail_threshold_us, "30000000");
 DEFINE_mBool(enable_file_cache_keep_base_compaction_output, "false");
 DEFINE_mInt64(file_cache_remove_block_qps_limit, "1000");
 DEFINE_mInt64(file_cache_background_gc_interval_ms, "100");
+DEFINE_mBool(enable_reader_dryrun_when_download_file_cache, "true");
 DEFINE_mInt64(file_cache_background_monitor_interval_ms, "5000");
 DEFINE_mInt64(file_cache_background_ttl_gc_interval_ms, "3000");
 DEFINE_mInt64(file_cache_background_ttl_gc_batch, "1000");
diff --git a/be/src/common/config.h b/be/src/common/config.h
index 2192531b94bfa1..13db2c7356b2c7 100644
--- a/be/src/common/config.h
+++ b/be/src/common/config.h
@@ -1143,6 +1143,7 @@ DECLARE_mInt64(cache_lock_held_long_tail_threshold_us);
 DECLARE_mBool(enable_file_cache_keep_base_compaction_output);
 DECLARE_mInt64(file_cache_remove_block_qps_limit);
 DECLARE_mInt64(file_cache_background_gc_interval_ms);
+DECLARE_mBool(enable_reader_dryrun_when_download_file_cache);
 DECLARE_mInt64(file_cache_background_monitor_interval_ms);
 DECLARE_mInt64(file_cache_background_ttl_gc_interval_ms);
 DECLARE_mInt64(file_cache_background_ttl_gc_batch);
diff --git a/be/src/io/cache/block_file_cache_downloader.cpp b/be/src/io/cache/block_file_cache_downloader.cpp
index 026f7e2a01741d..b9944e39989d2b 100644
--- a/be/src/io/cache/block_file_cache_downloader.cpp
+++ b/be/src/io/cache/block_file_cache_downloader.cpp
@@ -190,6 +190,7 @@ void FileCacheBlockDownloader::download_file_cache_block(
                         {
                                 .is_index_data = meta.cache_type() == ::doris::FileCacheType::INDEX,
                                 .expiration_time = meta.expiration_time(),
+                                .is_dryrun = config::enable_reader_dryrun_when_download_file_cache,
                         },
                 .download_done = std::move(download_done),
         };
@@ -229,6 +230,7 @@ void FileCacheBlockDownloader::download_segment_file(const DownloadFileMeta& met
         // TODO(plat1ko):
         //  1. Directly append buffer data to file cache
         //  2. Provide `FileReader::async_read()` interface
+        DCHECK(meta.ctx.is_dryrun == config::enable_reader_dryrun_when_download_file_cache);
         auto st = file_reader->read_at(offset, {buffer.get(), size}, &bytes_read, &meta.ctx);
         if (!st.ok()) {
             LOG(WARNING) << "failed to download file: " << st;
diff --git a/be/src/io/cache/cached_remote_file_reader.cpp b/be/src/io/cache/cached_remote_file_reader.cpp
index d1bd0b8023c23e..c7476b7ab7476c 100644
--- a/be/src/io/cache/cached_remote_file_reader.cpp
+++ b/be/src/io/cache/cached_remote_file_reader.cpp
@@ -45,6 +45,8 @@ namespace doris::io {
 bvar::Adder<uint64_t> s3_read_counter("cached_remote_reader_s3_read");
 bvar::LatencyRecorder g_skip_cache_num("cached_remote_reader_skip_cache_num");
 bvar::Adder<uint64_t> g_skip_cache_sum("cached_remote_reader_skip_cache_sum");
+bvar::Adder<uint64_t> g_skip_local_cache_io_sum_bytes(
+        "cached_remote_reader_skip_local_cache_io_sum_bytes");
 
 CachedRemoteFileReader::CachedRemoteFileReader(FileReaderSPtr remote_file_reader,
                                                const FileReaderOptions& opts)
@@ -110,6 +112,7 @@ std::pair<size_t, size_t> CachedRemoteFileReader::s_align_size(size_t offset, si
 
 Status CachedRemoteFileReader::read_at_impl(size_t offset, Slice result, size_t* bytes_read,
                                             const IOContext* io_ctx) {
+    const bool is_dryrun = io_ctx->is_dryrun;
     DCHECK(!closed());
     DCHECK(io_ctx);
     if (offset > size()) {
@@ -125,7 +128,7 @@ Status CachedRemoteFileReader::read_at_impl(size_t offset, Slice result, size_t*
     }
     ReadStatistics stats;
     auto defer_func = [&](int*) {
-        if (io_ctx->file_cache_stats) {
+        if (io_ctx->file_cache_stats && !is_dryrun) {
             // update stats in io_ctx, for query profile
             _update_stats(stats, io_ctx->file_cache_stats, io_ctx->is_inverted_index);
             // update stats increment in this reading procedure for file cache metrics
@@ -156,7 +159,9 @@ Status CachedRemoteFileReader::read_at_impl(size_t offset, Slice result, size_t*
                 size_t file_offset = cur_offset - iter->second->offset();
                 size_t reserve_bytes =
                         std::min(need_read_size, iter->second->range().size() - file_offset);
-                {
+                if (is_dryrun) [[unlikely]] {
+                    g_skip_local_cache_io_sum_bytes << reserve_bytes;
+                } else {
                     SCOPED_RAW_TIMER(&stats.local_read_timer);
                     if (!iter->second
                                  ->read(Slice(result.data + (cur_offset - offset), reserve_bytes),
@@ -241,7 +246,7 @@ Status CachedRemoteFileReader::read_at_impl(size_t offset, Slice result, size_t*
         }
         // copy from memory directly
         size_t right_offset = offset + bytes_req - 1;
-        if (empty_start <= right_offset && empty_end >= offset) {
+        if (empty_start <= right_offset && empty_end >= offset && !is_dryrun) {
             size_t copy_left_offset = offset < empty_start ? empty_start : offset;
             size_t copy_right_offset = right_offset < empty_end ? right_offset : empty_end;
             char* dst = result.data + (copy_left_offset - offset);
@@ -295,10 +300,14 @@ Status CachedRemoteFileReader::read_at_impl(size_t offset, Slice result, size_t*
              * the thread reads the data from remote too.
              */
             if (block_state == FileBlock::State::DOWNLOADED) {
-                size_t file_offset = current_offset - left;
-                SCOPED_RAW_TIMER(&stats.local_read_timer);
-                st = block->read(Slice(result.data + (current_offset - offset), read_size),
-                                 file_offset);
+                if (is_dryrun) [[unlikely]] {
+                    g_skip_local_cache_io_sum_bytes << read_size;
+                } else {
+                    size_t file_offset = current_offset - left;
+                    SCOPED_RAW_TIMER(&stats.local_read_timer);
+                    st = block->read(Slice(result.data + (current_offset - offset), read_size),
+                                     file_offset);
+                }
             }
             if (!st || block_state != FileBlock::State::DOWNLOADED) {
                 LOG(WARNING) << "Read data failed from file cache downloaded by others. err="
diff --git a/be/src/io/io_common.h b/be/src/io/io_common.h
index be56d0d63abcfd..d4a4e26a7c1840 100644
--- a/be/src/io/io_common.h
+++ b/be/src/io/io_common.h
@@ -67,6 +67,9 @@ struct IOContext {
     const TUniqueId* query_id = nullptr;             // Ref
     FileCacheStatistics* file_cache_stats = nullptr; // Ref
     bool is_inverted_index = false;
+    // if is_dryrun, read IO will download data to cache but return no data to reader
+    // useful to skip cache data read from local disk to accelarate warm up
+    bool is_dryrun = false;
 };
 
 } // namespace io
diff --git a/be/test/io/cache/block_file_cache_test.cpp b/be/test/io/cache/block_file_cache_test.cpp
index c2374913add4fd..0e62170b7609aa 100644
--- a/be/test/io/cache/block_file_cache_test.cpp
+++ b/be/test/io/cache/block_file_cache_test.cpp
@@ -7252,9 +7252,92 @@ TEST_F(BlockFileCacheTest, validate_get_or_set_crash) {
     SyncPoint::get_instance()->disable_processing();
     SyncPoint::get_instance()->clear_all_call_backs();
 
-    //if (fs::exists(cache_base_path)) {
-    //    fs::remove_all(cache_base_path);
-    //}
+    if (fs::exists(cache_base_path)) {
+        fs::remove_all(cache_base_path);
+    }
+}
+
+extern bvar::Adder<uint64_t> g_skip_local_cache_io_sum_bytes;
+
+TEST_F(BlockFileCacheTest, reader_dryrun_when_download_file_cache) {
+    bool org = config::enable_reader_dryrun_when_download_file_cache;
+    config::enable_reader_dryrun_when_download_file_cache = true;
+    if (fs::exists(cache_base_path)) {
+        fs::remove_all(cache_base_path);
+    }
+    fs::create_directories(cache_base_path);
+    TUniqueId query_id;
+    query_id.hi = 1;
+    query_id.lo = 1;
+    io::FileCacheSettings settings;
+    settings.query_queue_size = 6291456;
+    settings.query_queue_elements = 6;
+    settings.index_queue_size = 1048576;
+    settings.index_queue_elements = 1;
+    settings.disposable_queue_size = 1048576;
+    settings.disposable_queue_elements = 1;
+    settings.capacity = 8388608;
+    settings.max_file_block_size = 1048576;
+    settings.max_query_cache_size = 0;
+    io::CacheContext context;
+    ReadStatistics rstats;
+    context.stats = &rstats;
+    context.query_id = query_id;
+    ASSERT_TRUE(FileCacheFactory::instance()->create_file_cache(cache_base_path, settings).ok());
+    FileReaderSPtr local_reader;
+    ASSERT_TRUE(global_local_filesystem()->open_file(tmp_file, &local_reader));
+    io::FileReaderOptions opts;
+    opts.cache_type = io::cache_type_from_string("file_block_cache");
+    opts.is_doris_table = true;
+    CachedRemoteFileReader reader(local_reader, opts);
+    auto key = io::BlockFileCache::hash("tmp_file");
+    EXPECT_EQ(reader._cache_hash, key);
+    EXPECT_EQ(local_reader->path().native(), reader.path().native());
+    EXPECT_EQ(local_reader->size(), reader.size());
+    EXPECT_FALSE(reader.closed());
+    EXPECT_EQ(local_reader->path().native(), reader.get_remote_reader()->path().native());
+    {
+        std::string buffer;
+        buffer.resize(64_kb);
+        IOContext io_ctx;
+        RuntimeProfile profile("file_cache_test");
+        FileCacheProfileReporter reporter(&profile);
+        FileCacheStatistics stats;
+        io_ctx.file_cache_stats = &stats;
+        io_ctx.is_dryrun = true;
+        size_t bytes_read {0};
+        ASSERT_TRUE(reader.read_at(32222, Slice(buffer.data(), buffer.size()), &bytes_read, &io_ctx)
+                            .ok());
+        EXPECT_TRUE(std::all_of(buffer.begin(), buffer.end(), [](char c) { return c == '\0'; }));
+        reporter.update(&stats);
+    }
+    {
+        std::string buffer;
+        buffer.resize(64_kb);
+        IOContext io_ctx;
+        RuntimeProfile profile("file_cache_test");
+        FileCacheProfileReporter reporter(&profile);
+        FileCacheStatistics stats;
+        io_ctx.file_cache_stats = &stats;
+        io_ctx.is_dryrun = true;
+        size_t bytes_read {0};
+        ASSERT_TRUE(reader.read_at(32222, Slice(buffer.data(), buffer.size()), &bytes_read, &io_ctx)
+                            .ok());
+
+        EXPECT_TRUE(std::all_of(buffer.begin(), buffer.end(), [](char c) { return c == '\0'; }));
+        reporter.update(&stats);
+    }
+    EXPECT_EQ(g_skip_local_cache_io_sum_bytes.get_value(), 65536);
+
+    EXPECT_TRUE(reader.close().ok());
+    EXPECT_TRUE(reader.closed());
+    if (fs::exists(cache_base_path)) {
+        fs::remove_all(cache_base_path);
+    }
+    FileCacheFactory::instance()->_caches.clear();
+    FileCacheFactory::instance()->_path_to_cache.clear();
+    FileCacheFactory::instance()->_capacity = 0;
+    config::enable_reader_dryrun_when_download_file_cache = org;
 }
 
 } // namespace doris::io
diff --git a/regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/table/test_warm_up_same_table_multi_times.groovy b/regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/table/test_warm_up_same_table_multi_times.groovy
new file mode 100644
index 00000000000000..fd28dec7ddd75c
--- /dev/null
+++ b/regression-test/suites/cloud_p0/cache/multi_cluster/warm_up/table/test_warm_up_same_table_multi_times.groovy
@@ -0,0 +1,268 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+import org.codehaus.groovy.runtime.IOGroovyMethods
+
+suite("test_warm_up_same_table_multi_times") {
+    def ttlProperties = """ PROPERTIES("file_cache_ttl_seconds"="12000") """
+    def getJobState = { jobId ->
+         def jobStateResult = sql """  SHOW WARM UP JOB WHERE ID = ${jobId} """
+         return jobStateResult[0][2]
+    }
+
+    String[][] backends = sql """ show backends """
+    String backendId;
+    def backendIdToBackendIP = [:]
+    def backendIdToBackendHttpPort = [:]
+    def backendIdToBackendBrpcPort = [:]
+    for (String[] backend in backends) {
+        if (backend[9].equals("true") && backend[19].contains("regression_cluster_name0")) {
+            backendIdToBackendIP.put(backend[0], backend[1])
+            backendIdToBackendHttpPort.put(backend[0], backend[4])
+            backendIdToBackendBrpcPort.put(backend[0], backend[5])
+        }
+    }
+    assertEquals(backendIdToBackendIP.size(), 1)
+
+    backendId = backendIdToBackendIP.keySet()[0]
+    def url = backendIdToBackendIP.get(backendId) + ":" + backendIdToBackendHttpPort.get(backendId) + """/api/file_cache?op=clear&sync=true"""
+    logger.info(url)
+    def clearFileCache = { check_func ->
+        httpTest {
+            endpoint ""
+            uri url
+            op "get"
+            body ""
+            check check_func
+        }
+    }
+
+    def getMetricsMethod = { check_func ->
+        httpTest {
+            endpoint backendIdToBackendIP.get(backendId) + ":" + backendIdToBackendBrpcPort.get(backendId)
+            uri "/brpc_metrics"
+            op "get"
+            check check_func
+        }
+    }
+
+    def s3BucketName = getS3BucketName()
+    def s3WithProperties = """WITH S3 (
+        |"AWS_ACCESS_KEY" = "${getS3AK()}",
+        |"AWS_SECRET_KEY" = "${getS3SK()}",
+        |"AWS_ENDPOINT" = "${getS3Endpoint()}",
+        |"AWS_REGION" = "${getS3Region()}",
+        |"provider" = "${getS3Provider()}")
+        |PROPERTIES(
+        |"exec_mem_limit" = "8589934592",
+        |"load_parallelism" = "3")""".stripMargin()
+
+
+
+    sql "use @regression_cluster_name0"
+    // sql "use @compute_cluster"
+
+    def table = "customer"
+    sql new File("""${context.file.parent}/../ddl/${table}_delete.sql""").text
+    // create table if not exists
+    sql (new File("""${context.file.parent}/../ddl/${table}.sql""").text + ttlProperties)
+    sql """ alter table ${table} set ("disable_auto_compaction" = "true") """ // no influence from compaction
+
+    sleep(10000)
+
+    def load_customer_once =  {
+        def uniqueID = Math.abs(UUID.randomUUID().hashCode()).toString()
+        def loadLabel = table + "_" + uniqueID
+        // load data from cos
+        def loadSql = new File("""${context.file.parent}/../ddl/${table}_load.sql""").text.replaceAll("\\\$\\{s3BucketName\\}", s3BucketName)
+        loadSql = loadSql.replaceAll("\\\$\\{loadLabel\\}", loadLabel) + s3WithProperties
+        sql loadSql
+
+        // check load state
+        while (true) {
+            def stateResult = sql "show load where Label = '${loadLabel}'"
+            def loadState = stateResult[stateResult.size() - 1][2].toString()
+            if ("CANCELLED".equalsIgnoreCase(loadState)) {
+                throw new IllegalStateException("load ${loadLabel} failed.")
+            } else if ("FINISHED".equalsIgnoreCase(loadState)) {
+                break
+            }
+            sleep(5000)
+        }
+    }
+
+    clearFileCache.call();
+    sleep(30000)
+
+    load_customer_once()
+    load_customer_once()
+    load_customer_once()
+    load_customer_once()
+
+    def jobId = sql "warm up cluster regression_cluster_name0 with table customer;"
+    try {
+        sql "warm up cluster regression_cluster_name0 with table customer;"
+        assertTrue(false)
+    } catch (Exception e) {
+        assertTrue(true)
+    }
+    int retryTime = 120
+    int j = 0
+    for (; j < retryTime; j++) {
+        sleep(1000)
+        def status = getJobState(jobId[0][0])
+        logger.info(status)
+        if (status.equals("CANCELLED")) {
+            assertTrue(false);
+        }
+        if (status.equals("FINISHED")) {
+            break;
+        }
+    }
+    if (j == retryTime) {
+        sql "cancel warm up job where id = ${jobId[0][0]}"
+        assertTrue(false);
+    }
+    sleep(30000)
+    long ttl_cache_size = 0
+    getMetricsMethod.call() {
+        respCode, body ->
+            assertEquals("${respCode}".toString(), "200")
+            String out = "${body}".toString()
+            def strs = out.split('\n')
+            Boolean flag = false;
+            for (String line in strs) {
+                if (line.contains("ttl_cache_size")) {
+                    if (line.startsWith("#")) {
+                        continue
+                    }
+                    def i = line.indexOf(' ')
+                    ttl_cache_size = line.substring(i).toLong()
+                    flag = true
+                    break
+                }
+            }
+            assertTrue(flag)
+    }
+
+    long skip_io_bytes_start = 0;
+    getMetricsMethod.call() {
+        respCode, body ->
+            assertEquals("${respCode}".toString(), "200")
+            String out = "${body}".toString()
+            def strs = out.split('\n')
+            Boolean flag = false;
+            for (String line in strs) {
+                if (line.contains("cached_remote_reader_skip_local_cache_io_sum_bytes")) {
+                    if (line.startsWith("#")) {
+                        continue
+                    }
+                    def i = line.indexOf(' ')
+                    skip_io_bytes_start = line.substring(i).toLong()
+                    flag = true
+                    break
+                }
+            }
+            assertTrue(flag)
+    }
+
+    // AGAIN! regression_cluster_name1
+    jobId = sql "warm up cluster regression_cluster_name0 with table customer;"
+
+    retryTime = 120
+    j = 0
+    for (; j < retryTime; j++) {
+        sleep(1000)
+        def status = getJobState(jobId[0][0])
+        logger.info(status)
+        if (status.equals("CANCELLED")) {
+            assertTrue(false);
+        }
+        if (status.equals("FINISHED")) {
+            break;
+        }
+    }
+    if (j == retryTime) {
+        sql "cancel warm up job where id = ${jobId[0][0]}"
+        assertTrue(false);
+    }
+    sleep(30000)
+    ttl_cache_size = 0
+    getMetricsMethod.call() {
+        respCode, body ->
+            assertEquals("${respCode}".toString(), "200")
+            String out = "${body}".toString()
+            def strs = out.split('\n')
+            Boolean flag = false;
+            for (String line in strs) {
+                if (line.contains("ttl_cache_size")) {
+                    if (line.startsWith("#")) {
+                        continue
+                    }
+                    def i = line.indexOf(' ')
+                    ttl_cache_size = line.substring(i).toLong()
+                    flag = true
+                    break
+                }
+            }
+            assertTrue(flag)
+    }
+
+    getMetricsMethod.call() {
+        respCode, body ->
+            assertEquals("${respCode}".toString(), "200")
+            String out = "${body}".toString()
+            def strs = out.split('\n')
+            Boolean flag = false;
+            for (String line in strs) {
+                if (line.contains("ttl_cache_size")) {
+                    if (line.startsWith("#")) {
+                        continue
+                    }
+                    def i = line.indexOf(' ')
+                    assertEquals(ttl_cache_size, line.substring(i).toLong())
+                    flag = true
+                    break
+                }
+            }
+            assertTrue(flag)
+    }
+
+    long skip_io_bytes_end = 0;
+    getMetricsMethod.call() {
+        respCode, body ->
+            assertEquals("${respCode}".toString(), "200")
+            String out = "${body}".toString()
+            def strs = out.split('\n')
+            Boolean flag = false;
+            for (String line in strs) {
+                if (line.contains("cached_remote_reader_skip_local_cache_io_sum_bytes")) {
+                    if (line.startsWith("#")) {
+                        continue
+                    }
+                    def i = line.indexOf(' ')
+                    skip_io_bytes_end = line.substring(i).toLong()
+                    flag = true
+                    break
+                }
+            }
+            assertTrue(flag)
+    }
+    long diff = skip_io_bytes_end - skip_io_bytes_start;
+    println("skip_io_bytes diff: " + diff);
+    assertTrue(diff > 1000);
+}


Reviews:
user: login: gavinchou
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T16:18:20Z
user: login: gavinchou
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T16:22:23Z
user: login: gavinchou
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-22T16:52:38Z
user: login: freemandealer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-23T01:03:03Z
user: login: freemandealer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-23T01:04:07Z
user: login: freemandealer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-23T01:04:38Z
user: login: freemandealer
state: COMMENTED
author_association: MEMBER
submitted_at: 2025-04-23T02:44:25Z
user: login: gavinchou
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-04-24T13:08:20Z
user: login: dataroaring
body: LGTM
state: DISMISSED
author_association: CONTRIBUTOR
submitted_at: 2025-04-25T12:57:16Z
user: login: gavinchou
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-28T03:04:01Z
user: login: pingchunzhang
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-29T02:35:44Z

Review comments:
diff_hunk: @@ -45,6 +45,8 @@ namespace doris::io {
 bvar::Adder<uint64_t> s3_read_counter("cached_remote_reader_s3_read");
 bvar::LatencyRecorder g_skip_cache_num("cached_remote_reader_skip_cache_num");
 bvar::Adder<uint64_t> g_skip_cache_sum("cached_remote_reader_skip_cache_sum");
+bvar::Adder<uint64_t> g_skip_local_cache_io_sum_bytes(
+        "cached_remote_reader_skip_local_cache_io_sum_bytes");
path: be/src/io/cache/cached_remote_file_reader.cpp
user: login: gavinchou
body: suggest naming 
cached_remote_reader_skip_local_cache_io_bytes
created_at: 2025-04-22T16:18:20Z
author_association: CONTRIBUTOR
diff_hunk: @@ -229,6 +230,7 @@ void FileCacheBlockDownloader::download_segment_file(const DownloadFileMeta& met
         // TODO(plat1ko):
         //  1. Directly append buffer data to file cache
         //  2. Provide `FileReader::async_read()` interface
+        meta.ctx.is_dryrun = true;
path: be/src/io/cache/block_file_cache_downloader.cpp
user: login: gavinchou
body: why meta.is_dryrun is not set by the caller?
created_at: 2025-04-22T16:22:22Z
author_association: CONTRIBUTOR
diff_hunk: @@ -110,6 +112,7 @@ std::pair<size_t, size_t> CachedRemoteFileReader::s_align_size(size_t offset, si
 
 Status CachedRemoteFileReader::read_at_impl(size_t offset, Slice result, size_t* bytes_read,
                                             const IOContext* io_ctx) {
+    bool is_dryrun = io_ctx->is_dryrun;
path: be/src/io/cache/cached_remote_file_reader.cpp
user: login: gavinchou
body: const bool
created_at: 2025-04-22T16:26:30Z
author_association: CONTRIBUTOR
diff_hunk: @@ -229,6 +230,7 @@ void FileCacheBlockDownloader::download_segment_file(const DownloadFileMeta& met
         // TODO(plat1ko):
         //  1. Directly append buffer data to file cache
         //  2. Provide `FileReader::async_read()` interface
+        meta.ctx.is_dryrun = true;
path: be/src/io/cache/block_file_cache_downloader.cpp
user: login: freemandealer
body: too many of them and is safer to set here.
created_at: 2025-04-23T01:03:03Z
author_association: MEMBER
diff_hunk: @@ -45,6 +45,8 @@ namespace doris::io {
 bvar::Adder<uint64_t> s3_read_counter("cached_remote_reader_s3_read");
 bvar::LatencyRecorder g_skip_cache_num("cached_remote_reader_skip_cache_num");
 bvar::Adder<uint64_t> g_skip_cache_sum("cached_remote_reader_skip_cache_sum");
+bvar::Adder<uint64_t> g_skip_local_cache_io_sum_bytes(
+        "cached_remote_reader_skip_local_cache_io_sum_bytes");
path: be/src/io/cache/cached_remote_file_reader.cpp
user: login: freemandealer
body: add sum will underline its cumulative attribute
created_at: 2025-04-23T01:04:07Z
author_association: MEMBER
diff_hunk: @@ -110,6 +112,7 @@ std::pair<size_t, size_t> CachedRemoteFileReader::s_align_size(size_t offset, si
 
 Status CachedRemoteFileReader::read_at_impl(size_t offset, Slice result, size_t* bytes_read,
                                             const IOContext* io_ctx) {
+    bool is_dryrun = io_ctx->is_dryrun;
path: be/src/io/cache/cached_remote_file_reader.cpp
user: login: freemandealer
body: will do
created_at: 2025-04-23T01:04:38Z
author_association: MEMBER
diff_hunk: @@ -229,6 +230,7 @@ void FileCacheBlockDownloader::download_segment_file(const DownloadFileMeta& met
         // TODO(plat1ko):
         //  1. Directly append buffer data to file cache
         //  2. Provide `FileReader::async_read()` interface
+        meta.ctx.is_dryrun = true;
path: be/src/io/cache/block_file_cache_downloader.cpp
user: login: freemandealer
body: I'll set it by caller and use DCHECK here to ensure safety
created_at: 2025-04-23T02:44:25Z
author_association: MEMBER

PR comments:
user: login: hello-stephen
created_at: 2025-04-22T03:19:44Z
body: 
Thank you for your contribution to Apache Doris.
Don't know what should be done next? See [How to process your PR](https://cwiki.apache.org/confluence/display/DORIS/How+to+process+your+PR).

Please clearly describe your PR:
1. What problem was fixed (it's best to include specific error reporting information). How it was fixed.
2. Which behaviors were modified. What was the previous behavior, what is it now, why was it modified, and what possible impacts might there be.
3. What features were added. Why was this function added?
4. Which code was refactored and why was this part of the code refactored?
5. Which functions were optimized and what is the difference before and after the optimization?
    
author_association: CONTRIBUTOR
user: login: freemandealer
created_at: 2025-04-22T15:48:30Z
body: run buildall
author_association: MEMBER
user: login: hello-stephen
created_at: 2025-04-22T19:03:23Z
body: # BE UT Coverage Report
Increment line coverage `76.47% (13/17)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/4c104be375d1ed57fd1c4c204ba6d5020cae33cd_4c104be375d1ed57fd1c4c204ba6d5020cae33cd/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/4c104be375d1ed57fd1c4c204ba6d5020cae33cd_4c104be375d1ed57fd1c4c204ba6d5020cae33cd/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 53.54% (14536/27148) |
| Line Coverage     | 42.38% (126014/297363) |
| Region Coverage   | 41.18% (64398/156365) |
| Branch Coverage   | 35.76% (32369/90520) |
author_association: CONTRIBUTOR
user: login: hello-stephen
created_at: 2025-04-22T23:03:19Z
body: # BE Regression P0 && UT Coverage Report
Increment line coverage `61.90% (13/21)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/50275_4c104be375d1ed57fd1c4c204ba6d5020cae33cd_merge/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/50275_4c104be375d1ed57fd1c4c204ba6d5020cae33cd_merge/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage |                    |
| Line Coverage     |                    |
| Region Coverage   |                    |
| Branch Coverage   |                    |
author_association: CONTRIBUTOR
user: login: dataroaring
created_at: 2025-04-24T01:46:15Z
body: run buildall
author_association: CONTRIBUTOR
user: login: doris-robot
created_at: 2025-04-24T03:34:33Z
body: 
<details>
<summary>TPC-H: <b>Total hot run time: 34089 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit 4d4c014a63fcfdb7acc943fb2020d81b351064f9, data reload: false

------ Round 1 ----------------------------------
q1	26285	5060	5045	5045
q2	2070	280	194	194
q3	10377	1247	706	706
q4	10228	1009	525	525
q5	7534	2406	2374	2374
q6	188	163	134	134
q7	945	774	615	615
q8	9342	1296	1136	1136
q9	6753	5190	5155	5155
q10	6837	2328	1883	1883
q11	483	293	267	267
q12	360	360	227	227
q13	17765	3706	3133	3133
q14	220	225	206	206
q15	530	487	488	487
q16	451	448	403	403
q17	614	878	383	383
q18	7795	7271	6952	6952
q19	1883	943	569	569
q20	350	326	219	219
q21	4416	3462	2501	2501
q22	1066	1031	975	975
Total cold run time: 116492 ms
Total hot run time: 34089 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5598	5108	5090	5090
q2	238	327	230	230
q3	2129	2636	2336	2336
q4	1435	1847	1459	1459
q5	4517	4434	4402	4402
q6	221	166	126	126
q7	2000	1888	1744	1744
q8	2604	2646	2524	2524
q9	7232	7183	7187	7183
q10	2967	3169	2778	2778
q11	588	504	487	487
q12	675	774	614	614
q13	3493	3896	3304	3304
q14	291	310	273	273
q15	546	472	470	470
q16	453	501	461	461
q17	1169	1582	1407	1407
q18	7763	7616	7412	7412
q19	841	869	915	869
q20	1964	1962	1824	1824
q21	5253	4935	4782	4782
q22	1108	1093	1029	1029
Total cold run time: 53085 ms
Total hot run time: 50804 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-24T03:46:27Z
body: 
<details>
<summary>TPC-DS: <b>Total hot run time: 192694 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit 4d4c014a63fcfdb7acc943fb2020d81b351064f9, data reload: false

query1	1451	1067	1079	1067
query2	6057	1826	1818	1818
query3	11112	4420	4367	4367
query4	25368	23712	23394	23394
query5	4754	627	483	483
query6	313	209	195	195
query7	3992	489	293	293
query8	312	254	271	254
query9	8518	2539	2536	2536
query10	472	344	265	265
query11	15372	14962	14771	14771
query12	161	109	104	104
query13	1558	553	377	377
query14	8985	6159	6151	6151
query15	200	185	169	169
query16	7451	641	483	483
query17	1137	710	577	577
query18	1986	405	309	309
query19	195	190	165	165
query20	121	119	118	118
query21	203	127	107	107
query22	4525	4704	4439	4439
query23	34839	33667	33627	33627
query24	8568	2427	2423	2423
query25	528	450	423	423
query26	1194	276	149	149
query27	2846	498	333	333
query28	4789	2157	2155	2155
query29	717	571	450	450
query30	282	216	189	189
query31	880	860	786	786
query32	77	66	70	66
query33	545	373	326	326
query34	803	878	529	529
query35	812	853	797	797
query36	959	971	888	888
query37	114	105	78	78
query38	4290	4211	4124	4124
query39	1559	1450	1461	1450
query40	233	125	112	112
query41	56	54	62	54
query42	118	113	108	108
query43	494	494	493	493
query44	1338	818	833	818
query45	178	174	170	170
query46	842	1039	653	653
query47	1834	1874	1743	1743
query48	388	419	319	319
query49	760	502	437	437
query50	688	681	421	421
query51	4217	4258	4203	4203
query52	113	118	101	101
query53	238	255	181	181
query54	617	565	529	529
query55	80	82	82	82
query56	291	293	308	293
query57	1205	1222	1113	1113
query58	271	259	263	259
query59	2685	2903	2660	2660
query60	333	330	306	306
query61	135	122	124	122
query62	817	729	665	665
query63	255	185	196	185
query64	4090	1038	734	734
query65	4479	4353	4362	4353
query66	1102	429	311	311
query67	16044	15558	15353	15353
query68	8272	885	522	522
query69	468	309	272	272
query70	1168	1084	1105	1084
query71	449	303	302	302
query72	5623	4753	4915	4753
query73	653	631	356	356
query74	9301	9206	9024	9024
query75	3669	3320	2699	2699
query76	3455	1195	752	752
query77	769	376	277	277
query78	10085	10307	9226	9226
query79	2286	821	565	565
query80	571	493	435	435
query81	503	251	218	218
query82	479	126	95	95
query83	250	249	234	234
query84	251	105	83	83
query85	787	431	311	311
query86	377	303	305	303
query87	4367	4331	4294	4294
query88	3773	2213	2200	2200
query89	411	317	277	277
query90	1870	201	209	201
query91	143	137	114	114
query92	77	68	57	57
query93	1912	939	577	577
query94	683	393	295	295
query95	365	283	277	277
query96	498	564	274	274
query97	3124	3209	3114	3114
query98	237	222	204	204
query99	1571	1411	1286	1286
Total cold run time: 280393 ms
Total hot run time: 192694 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-24T03:51:38Z
body: 
<details>
<summary>ClickBench: <b>Total hot run time: 29.41 s</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit 4d4c014a63fcfdb7acc943fb2020d81b351064f9, data reload: false

query1	0.04	0.04	0.03
query2	0.12	0.10	0.12
query3	0.25	0.20	0.20
query4	1.60	0.20	0.20
query5	0.60	0.56	0.61
query6	1.18	0.70	0.73
query7	0.02	0.02	0.01
query8	0.05	0.03	0.04
query9	0.58	0.52	0.50
query10	0.57	0.57	0.56
query11	0.15	0.11	0.11
query12	0.14	0.11	0.11
query13	0.62	0.60	0.60
query14	1.16	1.16	1.22
query15	0.86	0.84	0.84
query16	0.39	0.39	0.38
query17	1.05	1.06	1.05
query18	0.21	0.20	0.20
query19	1.99	1.73	1.74
query20	0.02	0.01	0.01
query21	15.40	0.91	0.54
query22	0.74	1.12	0.74
query23	14.89	1.39	0.61
query24	6.82	1.79	0.71
query25	0.50	0.18	0.06
query26	0.55	0.16	0.13
query27	0.05	0.06	0.05
query28	9.52	0.88	0.43
query29	12.56	3.92	3.27
query30	0.26	0.10	0.06
query31	2.82	0.61	0.37
query32	3.22	0.56	0.46
query33	2.98	3.13	3.03
query34	15.69	5.14	4.51
query35	4.52	4.55	4.57
query36	0.71	0.49	0.50
query37	0.08	0.06	0.06
query38	0.06	0.04	0.04
query39	0.04	0.02	0.03
query40	0.16	0.14	0.13
query41	0.08	0.02	0.02
query42	0.03	0.02	0.02
query43	0.04	0.03	0.03
Total cold run time: 103.32 s
Total hot run time: 29.41 s
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-24T05:09:55Z
body: # BE UT Coverage Report
Increment line coverage `76.47% (13/17)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/4d4c014a63fcfdb7acc943fb2020d81b351064f9_4d4c014a63fcfdb7acc943fb2020d81b351064f9/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/4d4c014a63fcfdb7acc943fb2020d81b351064f9_4d4c014a63fcfdb7acc943fb2020d81b351064f9/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 53.54% (14534/27146) |
| Line Coverage     | 42.37% (126090/297593) |
| Region Coverage   | 41.18% (64443/156481) |
| Branch Coverage   | 35.79% (32418/90590) |
author_association: NONE
user: login: freemandealer
created_at: 2025-04-24T09:23:19Z
body: run buildall
author_association: MEMBER
user: login: doris-robot
created_at: 2025-04-24T10:36:20Z
body: 
<details>
<summary>TPC-H: <b>Total hot run time: 34030 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit be3934928e60eb89061fcb46b09f7af0300e115c, data reload: false

------ Round 1 ----------------------------------
q1	26187	5070	4971	4971
q2	2073	280	175	175
q3	10408	1254	698	698
q4	10229	1016	584	584
q5	7566	2478	2365	2365
q6	189	167	134	134
q7	920	752	605	605
q8	9298	1325	1119	1119
q9	6802	5102	5159	5102
q10	6802	2312	1893	1893
q11	477	284	267	267
q12	339	350	224	224
q13	17766	3734	3131	3131
q14	236	224	209	209
q15	563	488	512	488
q16	450	452	404	404
q17	586	881	363	363
q18	7744	7293	7108	7108
q19	1213	960	580	580
q20	342	335	221	221
q21	4351	3376	2420	2420
q22	1045	1006	969	969
Total cold run time: 115586 ms
Total hot run time: 34030 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5128	5112	5055	5055
q2	246	332	225	225
q3	2142	2700	2317	2317
q4	1463	1858	1428	1428
q5	4606	4587	4392	4392
q6	219	167	123	123
q7	1954	1916	1775	1775
q8	2601	2587	2554	2554
q9	7244	7193	7167	7167
q10	2999	3158	2727	2727
q11	585	518	483	483
q12	665	762	600	600
q13	3555	3934	3283	3283
q14	274	294	264	264
q15	544	504	487	487
q16	473	492	445	445
q17	1182	1612	1349	1349
q18	7637	7391	7502	7391
q19	810	864	1103	864
q20	2009	2023	1849	1849
q21	5205	4862	4631	4631
q22	1062	1067	980	980
Total cold run time: 52603 ms
Total hot run time: 50389 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-24T10:47:54Z
body: 
<details>
<summary>TPC-DS: <b>Total hot run time: 185687 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit be3934928e60eb89061fcb46b09f7af0300e115c, data reload: false

query1	1021	481	500	481
query2	6555	1864	1837	1837
query3	6749	217	218	217
query4	26648	23440	23122	23122
query5	4329	598	447	447
query6	314	206	188	188
query7	4610	484	274	274
query8	285	234	225	225
query9	8598	2579	2607	2579
query10	478	316	263	263
query11	15728	15034	14793	14793
query12	163	110	106	106
query13	1664	511	406	406
query14	9385	6151	6188	6151
query15	197	191	164	164
query16	7229	603	461	461
query17	1199	703	542	542
query18	1956	392	295	295
query19	186	184	165	165
query20	118	120	114	114
query21	205	123	108	108
query22	4075	4107	3950	3950
query23	34009	32966	33221	32966
query24	8461	2356	2366	2356
query25	528	458	396	396
query26	1228	265	150	150
query27	2766	503	322	322
query28	4361	2113	2083	2083
query29	781	545	426	426
query30	285	218	186	186
query31	948	843	763	763
query32	72	68	69	68
query33	558	355	334	334
query34	791	853	504	504
query35	807	826	731	731
query36	935	999	902	902
query37	113	100	84	84
query38	4166	4225	4089	4089
query39	1446	1466	1421	1421
query40	214	122	110	110
query41	67	60	58	58
query42	126	103	107	103
query43	468	512	486	486
query44	1335	817	809	809
query45	184	178	166	166
query46	820	1011	614	614
query47	1793	1759	1716	1716
query48	392	411	300	300
query49	784	515	448	448
query50	652	673	393	393
query51	4125	4164	4157	4157
query52	113	109	97	97
query53	220	259	226	226
query54	563	580	495	495
query55	82	77	79	77
query56	315	307	295	295
query57	1131	1201	1067	1067
query58	255	256	272	256
query59	2621	2681	2601	2601
query60	332	310	312	310
query61	131	132	126	126
query62	826	729	665	665
query63	226	190	186	186
query64	4377	1028	673	673
query65	4370	4245	4283	4245
query66	1120	423	307	307
query67	15795	15497	15250	15250
query68	8486	878	510	510
query69	453	304	256	256
query70	1204	1138	1150	1138
query71	471	328	293	293
query72	5357	4716	4760	4716
query73	730	583	339	339
query74	9163	9047	8921	8921
query75	4025	3184	2695	2695
query76	3680	1175	749	749
query77	788	376	282	282
query78	9996	10083	9245	9245
query79	2107	811	578	578
query80	630	515	492	492
query81	471	261	226	226
query82	473	131	96	96
query83	286	253	235	235
query84	292	105	79	79
query85	777	355	308	308
query86	334	303	280	280
query87	4330	4445	4390	4390
query88	2838	2235	2253	2235
query89	389	315	278	278
query90	1927	216	218	216
query91	144	137	111	111
query92	82	63	55	55
query93	1083	947	577	577
query94	664	413	308	308
query95	378	290	288	288
query96	480	557	272	272
query97	3182	3256	3097	3097
query98	224	246	199	199
query99	1441	1416	1318	1318
Total cold run time: 274269 ms
Total hot run time: 185687 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-24T10:53:07Z
body: 
<details>
<summary>ClickBench: <b>Total hot run time: 29.12 s</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit be3934928e60eb89061fcb46b09f7af0300e115c, data reload: false

query1	0.04	0.04	0.02
query2	0.11	0.11	0.10
query3	0.25	0.20	0.19
query4	1.60	0.19	0.11
query5	0.58	0.55	0.55
query6	1.18	0.71	0.72
query7	0.02	0.02	0.02
query8	0.05	0.03	0.04
query9	0.58	0.55	0.52
query10	0.57	0.56	0.58
query11	0.15	0.11	0.11
query12	0.15	0.11	0.11
query13	0.62	0.60	0.60
query14	1.18	1.21	1.17
query15	0.87	0.86	0.87
query16	0.40	0.40	0.38
query17	1.05	1.04	1.02
query18	0.21	0.20	0.20
query19	1.86	1.81	1.82
query20	0.01	0.02	0.01
query21	15.39	0.92	0.54
query22	0.76	1.22	0.62
query23	15.10	1.37	0.61
query24	7.24	1.14	0.53
query25	0.49	0.29	0.13
query26	0.60	0.15	0.12
query27	0.06	0.05	0.05
query28	10.03	0.87	0.45
query29	12.56	3.90	3.32
query30	0.25	0.10	0.07
query31	2.83	0.59	0.39
query32	3.22	0.55	0.48
query33	3.07	2.99	3.06
query34	15.77	5.12	4.50
query35	4.52	4.49	4.45
query36	0.66	0.50	0.49
query37	0.09	0.06	0.06
query38	0.05	0.03	0.04
query39	0.04	0.03	0.02
query40	0.17	0.13	0.12
query41	0.08	0.03	0.02
query42	0.03	0.03	0.03
query43	0.03	0.03	0.02
Total cold run time: 104.52 s
Total hot run time: 29.12 s
```
</details>

author_association: NONE
user: login: hello-stephen
created_at: 2025-04-24T12:50:25Z
body: # BE UT Coverage Report
Increment line coverage `81.25% (13/16)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/be3934928e60eb89061fcb46b09f7af0300e115c_be3934928e60eb89061fcb46b09f7af0300e115c/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/be3934928e60eb89061fcb46b09f7af0300e115c_be3934928e60eb89061fcb46b09f7af0300e115c/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 53.58% (14546/27146) |
| Line Coverage     | 42.43% (126275/297606) |
| Region Coverage   | 41.23% (64516/156479) |
| Branch Coverage   | 35.83% (32455/90588) |
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-24T13:09:13Z
body: PR approved by at least one committer and no changes requested.
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-24T13:09:17Z
body: PR approved by anyone and no changes requested.
author_association: CONTRIBUTOR
user: login: freemandealer
created_at: 2025-04-25T00:47:37Z
body: run buildall
author_association: MEMBER
user: login: doris-robot
created_at: 2025-04-25T02:19:50Z
body: 
<details>
<summary>TPC-H: <b>Total hot run time: 34185 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit dfabf305ed42f14c705818075acb83330d81f682, data reload: false

------ Round 1 ----------------------------------
q1	26412	5109	4974	4974
q2	2066	314	189	189
q3	10375	1237	694	694
q4	10214	1017	553	553
q5	7550	2374	2361	2361
q6	192	165	133	133
q7	918	749	623	623
q8	9328	1286	1108	1108
q9	6826	5097	5143	5097
q10	6885	2305	1923	1923
q11	487	289	273	273
q12	359	363	223	223
q13	17774	3643	3080	3080
q14	221	229	212	212
q15	556	507	490	490
q16	460	450	410	410
q17	604	874	377	377
q18	7509	7196	7212	7196
q19	1607	965	584	584
q20	330	342	225	225
q21	4350	3352	2478	2478
q22	1083	1007	982	982
Total cold run time: 116106 ms
Total hot run time: 34185 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5253	5462	5153	5153
q2	247	328	227	227
q3	2180	2665	2285	2285
q4	1499	1827	1479	1479
q5	4472	4393	4353	4353
q6	225	172	126	126
q7	2034	1935	1734	1734
q8	2631	2552	2520	2520
q9	7321	7099	7127	7099
q10	3031	3221	2793	2793
q11	590	507	492	492
q12	691	785	623	623
q13	3498	3855	3359	3359
q14	302	308	284	284
q15	525	475	491	475
q16	462	500	471	471
q17	1213	1602	1368	1368
q18	7813	7647	7449	7449
q19	842	896	1010	896
q20	2028	1949	1822	1822
q21	5411	4951	4834	4834
q22	1130	1076	1046	1046
Total cold run time: 53398 ms
Total hot run time: 50888 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-25T02:31:43Z
body: 
<details>
<summary>TPC-DS: <b>Total hot run time: 192550 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit dfabf305ed42f14c705818075acb83330d81f682, data reload: false

query1	1430	1100	1083	1083
query2	6125	1823	1800	1800
query3	11188	4715	4682	4682
query4	25872	23778	23387	23387
query5	5152	606	460	460
query6	311	201	187	187
query7	3977	478	274	274
query8	278	244	224	224
query9	8484	2587	2603	2587
query10	519	312	269	269
query11	15305	15046	14777	14777
query12	162	110	112	110
query13	1565	535	396	396
query14	9106	6013	6275	6013
query15	196	182	171	171
query16	7620	656	481	481
query17	1138	754	597	597
query18	2019	414	307	307
query19	197	190	165	165
query20	141	125	126	125
query21	205	120	109	109
query22	4454	4534	4455	4455
query23	34528	33816	33429	33429
query24	8875	2407	2452	2407
query25	500	473	446	446
query26	727	284	156	156
query27	2781	528	344	344
query28	4874	2171	2137	2137
query29	654	626	455	455
query30	283	227	191	191
query31	917	875	810	810
query32	77	65	66	65
query33	531	365	320	320
query34	805	869	567	567
query35	809	850	735	735
query36	986	958	888	888
query37	121	100	76	76
query38	4225	4406	4198	4198
query39	1507	1462	1463	1462
query40	212	125	109	109
query41	54	54	52	52
query42	122	103	109	103
query43	512	527	490	490
query44	1358	809	821	809
query45	187	184	169	169
query46	866	1022	645	645
query47	1821	1931	1816	1816
query48	381	415	310	310
query49	709	509	405	405
query50	679	696	414	414
query51	4245	4172	4159	4159
query52	112	111	104	104
query53	236	262	185	185
query54	601	599	524	524
query55	87	84	84	84
query56	315	320	340	320
query57	1174	1187	1154	1154
query58	278	278	292	278
query59	2720	2711	2589	2589
query60	345	340	308	308
query61	160	129	125	125
query62	779	759	682	682
query63	220	189	192	189
query64	2973	1041	680	680
query65	4428	4507	4321	4321
query66	813	397	307	307
query67	16089	15533	15516	15516
query68	9163	882	504	504
query69	530	298	276	276
query70	1166	1095	1095	1095
query71	461	310	297	297
query72	5291	4919	4634	4634
query73	687	576	344	344
query74	9251	8858	8667	8667
query75	4338	3220	2690	2690
query76	3707	1178	779	779
query77	780	362	282	282
query78	10058	10198	9335	9335
query79	1821	793	565	565
query80	620	505	439	439
query81	487	259	216	216
query82	421	125	94	94
query83	249	243	232	232
query84	264	103	102	102
query85	865	368	311	311
query86	346	302	289	289
query87	4370	4484	4306	4306
query88	3315	2211	2191	2191
query89	400	313	278	278
query90	1964	214	212	212
query91	138	135	110	110
query92	71	61	56	56
query93	1199	935	574	574
query94	660	422	311	311
query95	376	286	279	279
query96	492	561	277	277
query97	3129	3251	3150	3150
query98	227	199	195	195
query99	1473	1410	1268	1268
Total cold run time: 279439 ms
Total hot run time: 192550 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-25T02:36:55Z
body: 
<details>
<summary>ClickBench: <b>Total hot run time: 29.37 s</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit dfabf305ed42f14c705818075acb83330d81f682, data reload: false

query1	0.03	0.03	0.03
query2	0.12	0.11	0.12
query3	0.25	0.20	0.20
query4	1.60	0.20	0.20
query5	0.59	0.58	0.60
query6	1.18	0.72	0.72
query7	0.02	0.02	0.02
query8	0.04	0.04	0.04
query9	0.56	0.51	0.50
query10	0.56	0.57	0.56
query11	0.16	0.10	0.11
query12	0.15	0.10	0.12
query13	0.62	0.60	0.60
query14	1.14	1.17	1.18
query15	0.89	0.86	0.87
query16	0.38	0.38	0.38
query17	1.04	0.99	1.03
query18	0.22	0.19	0.19
query19	1.88	1.79	1.81
query20	0.01	0.02	0.01
query21	15.39	0.91	0.59
query22	0.76	1.27	0.65
query23	14.82	1.37	0.62
query24	7.56	1.60	0.38
query25	0.32	0.16	0.26
query26	0.63	0.17	0.13
query27	0.04	0.05	0.04
query28	9.21	0.93	0.42
query29	12.62	4.03	3.36
query30	0.25	0.09	0.06
query31	2.81	0.60	0.38
query32	3.23	0.55	0.47
query33	3.06	3.08	3.07
query34	15.85	5.14	4.54
query35	4.56	4.56	4.55
query36	0.67	0.50	0.48
query37	0.08	0.06	0.07
query38	0.05	0.04	0.04
query39	0.03	0.03	0.02
query40	0.18	0.14	0.13
query41	0.07	0.03	0.02
query42	0.04	0.03	0.02
query43	0.04	0.03	0.03
Total cold run time: 103.71 s
Total hot run time: 29.37 s
```
</details>

author_association: NONE
user: login: hello-stephen
created_at: 2025-04-25T04:00:51Z
body: # BE UT Coverage Report
Increment line coverage `81.25% (13/16)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/dfabf305ed42f14c705818075acb83330d81f682_dfabf305ed42f14c705818075acb83330d81f682/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/dfabf305ed42f14c705818075acb83330d81f682_dfabf305ed42f14c705818075acb83330d81f682/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 53.76% (14597/27151) |
| Line Coverage     | 42.58% (126686/297532) |
| Region Coverage   | 41.39% (64778/156510) |
| Branch Coverage   | 35.95% (32574/90614) |
author_association: CONTRIBUTOR
user: login: freemandealer
created_at: 2025-04-25T04:02:02Z
body: run cloud_p0
author_association: MEMBER
user: login: freemandealer
created_at: 2025-04-25T15:58:43Z
body: run buildall
author_association: MEMBER
user: login: doris-robot
created_at: 2025-04-25T17:39:50Z
body: 
<details>
<summary>TPC-H: <b>Total hot run time: 34290 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpch-tools
Tpch sf100 test result on commit f7753557f641bb825fe2748340f5b0ab74b5ac96, data reload: false

------ Round 1 ----------------------------------
q1	26037	5183	5113	5113
q2	2079	277	184	184
q3	10479	1279	708	708
q4	10251	1051	556	556
q5	7637	2530	2433	2433
q6	188	175	137	137
q7	928	757	624	624
q8	9336	1357	1167	1167
q9	6811	5074	5186	5074
q10	6859	2313	1885	1885
q11	479	284	271	271
q12	350	365	220	220
q13	17769	3688	3124	3124
q14	242	243	211	211
q15	540	487	480	480
q16	449	448	402	402
q17	644	887	367	367
q18	7734	7126	7040	7040
q19	2152	988	579	579
q20	335	339	228	228
q21	4195	3683	2515	2515
q22	1038	1004	972	972
Total cold run time: 116532 ms
Total hot run time: 34290 ms

----- Round 2, with runtime_filter_mode=off -----
q1	5288	5132	5131	5131
q2	248	335	234	234
q3	2127	2662	2299	2299
q4	1468	1924	1505	1505
q5	4507	4446	4410	4410
q6	228	176	130	130
q7	2023	1920	1880	1880
q8	2669	2648	2572	2572
q9	7263	7126	7200	7126
q10	2984	3228	2758	2758
q11	574	515	481	481
q12	683	756	603	603
q13	3585	3897	3352	3352
q14	266	284	264	264
q15	529	507	473	473
q16	460	502	465	465
q17	1205	1643	1374	1374
q18	7771	7649	7466	7466
q19	832	887	1021	887
q20	2000	1990	1818	1818
q21	5305	4993	4836	4836
q22	1120	1050	1027	1027
Total cold run time: 53135 ms
Total hot run time: 51091 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-25T17:52:07Z
body: 
<details>
<summary>TPC-DS: <b>Total hot run time: 192695 ms</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/tpcds-tools
TPC-DS sf100 test result on commit f7753557f641bb825fe2748340f5b0ab74b5ac96, data reload: false

query1	1416	1103	1044	1044
query2	6210	1932	1889	1889
query3	10975	4688	4562	4562
query4	55222	25946	23071	23071
query5	5117	480	463	463
query6	343	210	188	188
query7	4887	488	288	288
query8	306	247	241	241
query9	5516	2611	2610	2610
query10	440	328	274	274
query11	15173	14964	14853	14853
query12	163	111	105	105
query13	1027	534	397	397
query14	10252	6297	6517	6297
query15	202	206	184	184
query16	7180	643	478	478
query17	1106	768	604	604
query18	1720	418	317	317
query19	204	203	208	203
query20	137	131	121	121
query21	206	125	112	112
query22	4298	4483	4188	4188
query23	34220	33483	33365	33365
query24	6609	2442	2444	2442
query25	481	479	414	414
query26	687	283	156	156
query27	2331	508	340	340
query28	3197	2175	2176	2175
query29	574	561	431	431
query30	279	222	194	194
query31	832	854	828	828
query32	71	62	72	62
query33	457	379	321	321
query34	764	861	544	544
query35	785	853	765	765
query36	956	1025	916	916
query37	119	107	81	81
query38	4300	4256	4241	4241
query39	1462	1466	1442	1442
query40	217	142	109	109
query41	61	55	52	52
query42	122	109	105	105
query43	518	518	512	512
query44	1349	818	834	818
query45	180	181	167	167
query46	847	1030	647	647
query47	1859	1855	1783	1783
query48	388	420	303	303
query49	694	504	430	430
query50	685	701	429	429
query51	4173	4220	4200	4200
query52	111	106	99	99
query53	234	280	190	190
query54	591	611	529	529
query55	83	90	82	82
query56	301	299	307	299
query57	1220	1215	1192	1192
query58	267	279	249	249
query59	2800	2990	2687	2687
query60	333	353	310	310
query61	131	129	129	129
query62	737	785	675	675
query63	235	191	196	191
query64	1822	1050	708	708
query65	4339	4241	4281	4241
query66	702	402	305	305
query67	15681	15606	15453	15453
query68	8040	821	502	502
query69	543	310	267	267
query70	1141	1126	1126	1126
query71	494	308	289	289
query72	6026	4759	4877	4759
query73	1533	639	341	341
query74	9127	9028	8703	8703
query75	3743	3213	2720	2720
query76	4171	1199	765	765
query77	621	367	281	281
query78	10156	10060	9229	9229
query79	2181	801	610	610
query80	608	497	466	466
query81	494	255	218	218
query82	472	124	94	94
query83	263	246	230	230
query84	295	97	87	87
query85	818	353	316	316
query86	406	300	302	300
query87	4464	4368	4415	4368
query88	3861	2252	2214	2214
query89	405	317	278	278
query90	1745	210	217	210
query91	145	144	109	109
query92	81	61	57	57
query93	1851	936	579	579
query94	666	397	311	311
query95	365	289	295	289
query96	495	563	272	272
query97	3161	3242	3124	3124
query98	220	203	203	203
query99	1627	1412	1278	1278
Total cold run time: 301122 ms
Total hot run time: 192695 ms
```
</details>

author_association: NONE
user: login: doris-robot
created_at: 2025-04-25T17:57:26Z
body: 
<details>
<summary>ClickBench: <b>Total hot run time: 29.59 s</b></summary>

```
machine: 'aliyun_ecs.c7a.8xlarge_32C64G'
scripts: https://github.com/apache/doris/tree/master/tools/clickbench-tools
ClickBench test result on commit f7753557f641bb825fe2748340f5b0ab74b5ac96, data reload: false

query1	0.03	0.03	0.03
query2	0.11	0.10	0.11
query3	0.26	0.20	0.19
query4	1.59	0.20	0.20
query5	0.61	0.59	0.57
query6	1.19	0.72	0.72
query7	0.02	0.02	0.01
query8	0.05	0.03	0.04
query9	0.57	0.55	0.52
query10	0.57	0.57	0.56
query11	0.15	0.11	0.10
query12	0.14	0.11	0.11
query13	0.61	0.60	0.60
query14	1.20	1.17	1.21
query15	0.86	0.85	0.85
query16	0.38	0.40	0.39
query17	1.06	1.02	1.02
query18	0.21	0.19	0.19
query19	1.91	1.77	1.78
query20	0.02	0.01	0.01
query21	15.41	0.89	0.53
query22	0.75	1.11	0.63
query23	15.03	1.39	0.61
query24	7.25	0.88	1.31
query25	0.48	0.14	0.15
query26	0.62	0.16	0.14
query27	0.05	0.06	0.05
query28	9.30	0.87	0.43
query29	12.56	4.03	3.35
query30	0.26	0.09	0.07
query31	2.82	0.60	0.38
query32	3.23	0.55	0.46
query33	3.26	3.04	3.08
query34	15.63	5.08	4.48
query35	4.50	4.51	4.45
query36	0.66	0.50	0.49
query37	0.09	0.07	0.06
query38	0.05	0.04	0.03
query39	0.03	0.02	0.02
query40	0.18	0.14	0.13
query41	0.09	0.03	0.03
query42	0.03	0.02	0.02
query43	0.04	0.03	0.03
Total cold run time: 103.86 s
Total hot run time: 29.59 s
```
</details>

author_association: NONE
user: login: hello-stephen
created_at: 2025-04-25T19:20:16Z
body: # BE UT Coverage Report
Increment line coverage `81.25% (13/16)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/f7753557f641bb825fe2748340f5b0ab74b5ac96_f7753557f641bb825fe2748340f5b0ab74b5ac96/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/f7753557f641bb825fe2748340f5b0ab74b5ac96_f7753557f641bb825fe2748340f5b0ab74b5ac96/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 54.14% (14684/27124) |
| Line Coverage     | 43.00% (127859/297352) |
| Region Coverage   | 41.85% (65478/156447) |
| Branch Coverage   | 36.45% (33015/90564) |
author_association: CONTRIBUTOR
user: login: hello-stephen
created_at: 2025-04-25T22:52:53Z
body: # BE Regression P0 && UT Coverage Report
Increment line coverage `28.26% (13/46)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/50275_f7753557f641bb825fe2748340f5b0ab74b5ac96_merge/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/50275_f7753557f641bb825fe2748340f5b0ab74b5ac96_merge/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 55.11% (14677/26630) |
| Line Coverage     | 44.50% (132113/296862) |
| Region Coverage   | 41.58% (76036/182870) |
| Branch Coverage   | 35.67% (36778/103118) |
author_association: CONTRIBUTOR
user: login: freemandealer
created_at: 2025-04-26T03:02:25Z
body: run p0
author_association: MEMBER
user: login: hello-stephen
created_at: 2025-04-26T05:18:55Z
body: # BE Regression P0 && UT Coverage Report
Increment line coverage `28.26% (13/46)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/50275_f7753557f641bb825fe2748340f5b0ab74b5ac96_merge/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/50275_f7753557f641bb825fe2748340f5b0ab74b5ac96_merge/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 55.66% (14821/26630) |
| Line Coverage     | 45.12% (133951/296862) |
| Region Coverage   | 42.37% (77491/182870) |
| Branch Coverage   | 36.47% (37609/103118) |
author_association: CONTRIBUTOR
user: login: hello-stephen
created_at: 2025-04-27T02:28:00Z
body: # BE Regression P0 && UT Coverage Report
Increment line coverage `28.26% (13/46)` :tada:

[Increment coverage report](http://coverage.selectdb-in.cc/coverage/50275_f7753557f641bb825fe2748340f5b0ab74b5ac96_merge/increment_report/index.html)
[Complete coverage report](http://coverage.selectdb-in.cc/coverage/50275_f7753557f641bb825fe2748340f5b0ab74b5ac96_merge/report/index.html)
| Category          | Coverage           |
|-------------------|--------------------|
| Function Coverage | 55.66% (14821/26630) |
| Line Coverage     | 45.12% (133951/296862) |
| Region Coverage   | 42.37% (77491/182870) |
| Branch Coverage   | 36.47% (37609/103118) |
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-28T03:04:56Z
body: PR approved by at least one committer and no changes requested.
author_association: CONTRIBUTOR