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

Yukang-Lian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new e43a387eaa6 [fix](compaction) Count empty rowsets in approximate 
compaction score (#66610)
e43a387eaa6 is described below

commit e43a387eaa646ea36bb3689ab2c324bc9824bf9b
Author: Jamie <[email protected]>
AuthorDate: Tue Aug 11 15:54:12 2026 +0800

    [fix](compaction) Count empty rowsets in approximate compaction score 
(#66610)
    
    Problem Summary:
    
    Cloud cumulative compaction scheduling maintains an approximate score
    between metadata synchronizations. The online write path used the raw
    segment count, so a zero-segment rowset added no score even though
    metadata synchronization counts every empty rowset as one. Empty rowsets
    could therefore accumulate without increasing tablet scheduling
    priority.
    
    This PR clamps the online contribution of a load rowset to at least one
    and adds the same contribution for zero-segment delete-predicate
    rowsets, which bypass `CloudRowsetBuilder`. Non-empty PREPARED rowsets
    keep the existing segment-based estimate because their versions have not
    been assigned yet.
    
    The unit test models that PREPARED, versionless lifecycle and verifies
    both cases: a zero-segment rowset contributes one, while a three-segment
    rowset still contributes three.
    
    ### Release note
    
    Fix cloud cumulative compaction scheduling for empty rowsets.
---
 be/src/cloud/cloud_delete_task.cpp      |  1 +
 be/src/cloud/cloud_rowset_builder.cpp   |  4 ++-
 be/test/cloud/cloud_compaction_test.cpp | 52 +++++++++++++++++++++++++++++++++
 3 files changed, 56 insertions(+), 1 deletion(-)

diff --git a/be/src/cloud/cloud_delete_task.cpp 
b/be/src/cloud/cloud_delete_task.cpp
index 82c52b968cc..34f9354285e 100644
--- a/be/src/cloud/cloud_delete_task.cpp
+++ b/be/src/cloud/cloud_delete_task.cpp
@@ -112,6 +112,7 @@ Status CloudDeleteTask::execute(CloudStorageEngine& engine, 
const TPushReq& requ
     // Update tablet stats
     tablet->fetch_add_approximate_num_rowsets(1);
     tablet->fetch_add_approximate_cumu_num_rowsets(1);
+    tablet->fetch_add_approximate_cumu_num_deltas(1);
 
     // TODO(liaoxin) delete operator don't send calculate delete bitmap task 
from fe,
     //  then we don't need to set_txn_related_info here.
diff --git a/be/src/cloud/cloud_rowset_builder.cpp 
b/be/src/cloud/cloud_rowset_builder.cpp
index be36abf5775..d36048a6646 100644
--- a/be/src/cloud/cloud_rowset_builder.cpp
+++ b/be/src/cloud/cloud_rowset_builder.cpp
@@ -17,6 +17,8 @@
 
 #include "cloud/cloud_rowset_builder.h"
 
+#include <algorithm>
+
 #include "cloud/cloud_meta_mgr.h"
 #include "cloud/cloud_storage_engine.h"
 #include "cloud/cloud_tablet.h"
@@ -222,7 +224,7 @@ void CloudRowsetBuilder::update_tablet_stats() {
     tablet->fetch_add_approximate_num_rows(_rowset->num_rows());
     tablet->fetch_add_approximate_data_size(_rowset->total_disk_size());
     tablet->fetch_add_approximate_cumu_num_rowsets(1);
-    tablet->fetch_add_approximate_cumu_num_deltas(_rowset->num_segments());
+    
tablet->fetch_add_approximate_cumu_num_deltas(std::max<int64_t>(_rowset->num_segments(),
 1));
     tablet->write_count.fetch_add(1, std::memory_order_relaxed);
 }
 
diff --git a/be/test/cloud/cloud_compaction_test.cpp 
b/be/test/cloud/cloud_compaction_test.cpp
index 78440a82de3..9ebf0c8d01e 100644
--- a/be/test/cloud/cloud_compaction_test.cpp
+++ b/be/test/cloud/cloud_compaction_test.cpp
@@ -26,6 +26,7 @@
 
 #include "cloud/cloud_base_compaction.h"
 #include "cloud/cloud_cluster_info.h"
+#include "cloud/cloud_rowset_builder.h"
 #include "cloud/cloud_storage_engine.h"
 #include "cloud/cloud_tablet.h"
 #include "cloud/cloud_tablet_mgr.h"
@@ -405,6 +406,57 @@ static RowsetSharedPtr create_rowset(Version version, int 
num_segments, bool ove
     return rowset;
 }
 
+static RowsetSharedPtr create_prepared_rowset(int num_segments, int data_size) 
{
+    auto rs_meta = std::make_shared<RowsetMeta>();
+    rs_meta->set_rowset_type(BETA_ROWSET);
+    rs_meta->set_rowset_state(PREPARED);
+    rs_meta->set_num_segments(num_segments);
+    rs_meta->set_segments_overlap(OVERLAPPING);
+    rs_meta->set_total_disk_size(data_size);
+    RowsetSharedPtr rowset;
+    Status st = RowsetFactory::create_rowset(nullptr, "", rs_meta, &rowset);
+    if (!st.ok()) {
+        return nullptr;
+    }
+    return rowset;
+}
+
+class TestableCloudRowsetBuilder : public CloudRowsetBuilder {
+public:
+    using CloudRowsetBuilder::CloudRowsetBuilder;
+
+    void set_tablet_and_rowset(const CloudTabletSPtr& tablet, const 
RowsetSharedPtr& rowset) {
+        _tablet = tablet;
+        _rowset = rowset;
+    }
+};
+
+TEST_F(CloudCompactionTest, update_tablet_stats_counts_zero_segment_rowset) {
+    auto tablet = std::make_shared<CloudTablet>(_engine, _tablet_meta);
+    {
+        std::unique_lock lock(tablet->get_header_lock());
+        tablet->reset_approximate_stats(0, 0, 0, 0);
+    }
+
+    TestableCloudRowsetBuilder builder(_engine, WriteRequest {}, nullptr);
+
+    auto empty_rowset = create_prepared_rowset(0, 0);
+    ASSERT_NE(empty_rowset, nullptr);
+    ASSERT_TRUE(empty_rowset->is_pending());
+    ASSERT_FALSE(empty_rowset->rowset_meta()->has_version());
+    builder.set_tablet_and_rowset(tablet, empty_rowset);
+    builder.update_tablet_stats();
+    EXPECT_EQ(tablet->fetch_add_approximate_cumu_num_deltas(0), 1);
+
+    auto overlapping_rowset = create_prepared_rowset(3, 41);
+    ASSERT_NE(overlapping_rowset, nullptr);
+    ASSERT_TRUE(overlapping_rowset->is_pending());
+    ASSERT_FALSE(overlapping_rowset->rowset_meta()->has_version());
+    builder.set_tablet_and_rowset(tablet, overlapping_rowset);
+    builder.update_tablet_stats();
+    EXPECT_EQ(tablet->fetch_add_approximate_cumu_num_deltas(0), 4);
+}
+
 class TestableCloudCompaction : public CloudCompactionMixin {
 public:
     TestableCloudCompaction(CloudStorageEngine& engine, CloudTabletSPtr tablet)


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

Reply via email to