This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.2
in repository https://gitbox.apache.org/repos/asf/doris.git
commit 35209246c04e4ac018d1aea3d63002ec6482c5c2
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Sep 22 16:07:53 2026 +0800
branch-4.1: [fix](compaction) Count empty rowsets in approximate compaction
score #66610 (#66656)
Cherry-picked from #66610
---------
Co-authored-by: Jamie <[email protected]>
---
be/src/cloud/cloud_delete_task.cpp | 1 +
be/src/cloud/cloud_rowset_builder.cpp | 4 ++-
be/test/cloud/cloud_compaction_test.cpp | 45 +++++++++++++++++++++++++++++++++
3 files changed, 49 insertions(+), 1 deletion(-)
diff --git a/be/src/cloud/cloud_delete_task.cpp
b/be/src/cloud/cloud_delete_task.cpp
index 6ad6fd9d65e..db8aec687c6 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 29ece82d320..a1bbbdca8f3 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"
@@ -124,7 +126,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 d67ea4244a3..6b88353d08a 100644
--- a/be/test/cloud/cloud_compaction_test.cpp
+++ b/be/test/cloud/cloud_compaction_test.cpp
@@ -30,6 +30,7 @@
#include "cloud/cloud_base_compaction.h"
#include "cloud/cloud_cluster_info.h"
#include "cloud/cloud_cumulative_compaction.h"
+#include "cloud/cloud_rowset_builder.h"
#include "cloud/cloud_storage_engine.h"
#include "cloud/cloud_tablet.h"
#include "cloud/cloud_tablet_mgr.h"
@@ -37,6 +38,7 @@
#include "common/metrics/doris_metrics.h"
#include "cpp/sync_point.h"
#include "json2pb/json_to_pb.h"
+#include "runtime/runtime_profile.h"
#include "storage/compaction/cumulative_compaction_time_series_policy.h"
#include "storage/olap_common.h"
#include "storage/rowset/rowset_factory.h"
@@ -340,6 +342,49 @@ 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;
+}
+
+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);
+ }
+
+ RuntimeProfile profile("CloudCompactionTest");
+ CloudRowsetBuilder builder(_engine, WriteRequest {}, &profile);
+
+ 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._tablet = tablet;
+ builder._rowset = 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._rowset = overlapping_rowset;
+ builder.update_tablet_stats();
+ EXPECT_EQ(tablet->fetch_add_approximate_cumu_num_deltas(0), 4);
+}
+
TEST_F(CloudCompactionTest,
cumulative_global_lock_failure_keeps_thread_count_balanced) {
ASSERT_TRUE(ThreadPoolBuilder("CumuCompactionTaskThreadPoolTest")
.set_min_threads(1)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]