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

dataroaring 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 7f5bfb0c13d [Fix](tablet-meta) limit the data size of tablet meta 
(#39455)
7f5bfb0c13d is described below

commit 7f5bfb0c13d1b93722405122bff3626a2722cf93
Author: Luwei <814383...@qq.com>
AuthorDate: Mon Aug 26 12:14:00 2024 +0800

    [Fix](tablet-meta) limit the data size of tablet meta (#39455)
---
 be/src/common/config.cpp       |  7 +++++++
 be/src/common/config.h         |  2 ++
 be/src/olap/push_handler.cpp   | 11 +++++++++++
 be/src/olap/rowset_builder.cpp | 10 ++++++++++
 be/src/olap/schema_change.cpp  |  2 +-
 be/src/olap/tablet.h           | 11 +++++++++++
 be/src/olap/tablet_meta.cpp    | 21 +++++++++++++++++++++
 be/src/olap/tablet_meta.h      |  9 +++++++++
 8 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/be/src/common/config.cpp b/be/src/common/config.cpp
index f72d191b847..632d3da082b 100644
--- a/be/src/common/config.cpp
+++ b/be/src/common/config.cpp
@@ -1306,6 +1306,13 @@ DEFINE_mBool(enable_hdfs_mem_limiter, "true");
 
 DEFINE_mInt16(topn_agg_limit_multiplier, "2");
 
+// Tablet meta size limit after serialization, 1.5GB
+DEFINE_mInt64(tablet_meta_serialize_size_limit, "1610612736");
+// Protobuf supports a maximum of 2GB, so the size of the tablet meta after 
serialization must be less than 2GB
+// 1717986918 = 2GB * 0.8
+DEFINE_Validator(tablet_meta_serialize_size_limit,
+                 [](const int64_t config) -> bool { return config < 
1717986918; });
+
 DEFINE_mInt64(pipeline_task_leakage_detect_period_secs, "60");
 
 // clang-format off
diff --git a/be/src/common/config.h b/be/src/common/config.h
index c371ad7ef3b..cfe108f0592 100644
--- a/be/src/common/config.h
+++ b/be/src/common/config.h
@@ -1407,6 +1407,8 @@ DECLARE_mBool(enable_hdfs_mem_limiter);
 // we should do agg limit opt
 DECLARE_mInt16(topn_agg_limit_multiplier);
 
+DECLARE_mInt64(tablet_meta_serialize_size_limit);
+
 DECLARE_mInt64(pipeline_task_leakage_detect_period_secs);
 
 #ifdef BE_TEST
diff --git a/be/src/olap/push_handler.cpp b/be/src/olap/push_handler.cpp
index feb7d24dda2..aef701a0545 100644
--- a/be/src/olap/push_handler.cpp
+++ b/be/src/olap/push_handler.cpp
@@ -166,6 +166,17 @@ Status 
PushHandler::_do_streaming_ingestion(TabletSharedPtr tablet, const TPushR
                 "failed to push data. version count: {}, exceed limit: {}, 
tablet: {}",
                 tablet->version_count(), config::max_tablet_version_num, 
tablet->tablet_id());
     }
+
+    int version_count = tablet->version_count() + 
tablet->stale_version_count();
+    if (tablet->avg_rs_meta_serialize_size() * version_count >
+        config::tablet_meta_serialize_size_limit) {
+        return Status::Error<TOO_MANY_VERSION>(
+                "failed to init rowset builder. meta serialize size : {}, 
exceed limit: {}, "
+                "tablet: {}",
+                tablet->avg_rs_meta_serialize_size() * version_count,
+                config::tablet_meta_serialize_size_limit, tablet->tablet_id());
+    }
+
     auto tablet_schema = std::make_shared<TabletSchema>();
     tablet_schema->copy_from(*tablet->tablet_schema());
     if (!request.columns_desc.empty() && request.columns_desc[0].col_unique_id 
>= 0) {
diff --git a/be/src/olap/rowset_builder.cpp b/be/src/olap/rowset_builder.cpp
index f80c6457215..39fcc3f6c23 100644
--- a/be/src/olap/rowset_builder.cpp
+++ b/be/src/olap/rowset_builder.cpp
@@ -195,6 +195,16 @@ Status RowsetBuilder::init() {
         RETURN_IF_ERROR(check_tablet_version_count());
     }
 
+    int version_count = tablet()->version_count() + 
tablet()->stale_version_count();
+    if (tablet()->avg_rs_meta_serialize_size() * version_count >
+        config::tablet_meta_serialize_size_limit) {
+        return Status::Error<TOO_MANY_VERSION>(
+                "failed to init rowset builder. meta serialize size : {}, 
exceed limit: {}, "
+                "tablet: {}",
+                tablet()->avg_rs_meta_serialize_size() * version_count,
+                config::tablet_meta_serialize_size_limit, 
_tablet->tablet_id());
+    }
+
     RETURN_IF_ERROR(prepare_txn());
 
     DBUG_EXECUTE_IF("BaseRowsetBuilder::init.check_partial_update_column_num", 
{
diff --git a/be/src/olap/schema_change.cpp b/be/src/olap/schema_change.cpp
index 1771bfb7c67..04409e37d84 100644
--- a/be/src/olap/schema_change.cpp
+++ b/be/src/olap/schema_change.cpp
@@ -894,7 +894,7 @@ Status SchemaChangeJob::_do_process_alter_tablet(const 
TAlterTabletReqV2& reques
                 }
             }
             std::vector<RowsetSharedPtr> empty_vec;
-            RETURN_IF_ERROR(_new_tablet->modify_rowsets(empty_vec, 
rowsets_to_delete));
+            _new_tablet->delete_rowsets(rowsets_to_delete, false);
             // inherit cumulative_layer_point from base_tablet
             // check if new_tablet.ce_point > base_tablet.ce_point?
             _new_tablet->set_cumulative_layer_point(-1);
diff --git a/be/src/olap/tablet.h b/be/src/olap/tablet.h
index 4cd2a355586..800c720a1c4 100644
--- a/be/src/olap/tablet.h
+++ b/be/src/olap/tablet.h
@@ -148,6 +148,7 @@ public:
 
     size_t num_rows();
     int version_count() const;
+    int stale_version_count() const;
     bool exceed_version_limit(int32_t limit) override;
     uint64_t segment_count() const;
     Version max_version() const;
@@ -164,6 +165,7 @@ public:
     double bloom_filter_fpp() const;
     size_t next_unique_id() const;
     size_t row_size() const;
+    int64_t avg_rs_meta_serialize_size() const;
 
     // operation in rowsets
     Status add_rowset(RowsetSharedPtr rowset);
@@ -676,6 +678,11 @@ inline int Tablet::version_count() const {
     return _tablet_meta->version_count();
 }
 
+inline int Tablet::stale_version_count() const {
+    std::shared_lock rdlock(_meta_lock);
+    return _tablet_meta->stale_version_count();
+}
+
 inline Version Tablet::max_version() const {
     std::shared_lock rdlock(_meta_lock);
     return _tablet_meta->max_version();
@@ -730,4 +737,8 @@ inline size_t Tablet::row_size() const {
     return _tablet_meta->tablet_schema()->row_size();
 }
 
+inline int64_t Tablet::avg_rs_meta_serialize_size() const {
+    return _tablet_meta->avg_rs_meta_serialize_size();
+}
+
 } // namespace doris
diff --git a/be/src/olap/tablet_meta.cpp b/be/src/olap/tablet_meta.cpp
index ed9a446551d..19302da7117 100644
--- a/be/src/olap/tablet_meta.cpp
+++ b/be/src/olap/tablet_meta.cpp
@@ -26,11 +26,13 @@
 #include <json2pb/pb_to_json.h>
 #include <time.h>
 
+#include <cstdint>
 #include <set>
 #include <utility>
 
 #include "cloud/config.h"
 #include "common/config.h"
+#include "gutil/integral_types.h"
 #include "io/fs/file_writer.h"
 #include "io/fs/local_file_system.h"
 #include "olap/data_dir.h"
@@ -532,6 +534,25 @@ void TabletMeta::serialize(string* meta_binary) {
                      << partition_id << " new=" << 
tablet_meta_pb.DebugString();
     });
     bool serialize_success = tablet_meta_pb.SerializeToString(meta_binary);
+    if (!_rs_metas.empty() || !_stale_rs_metas.empty()) {
+        _avg_rs_meta_serialize_size =
+                meta_binary->length() / (_rs_metas.size() + 
_stale_rs_metas.size());
+        if (meta_binary->length() > config::tablet_meta_serialize_size_limit ||
+            !serialize_success) {
+            int64_t origin_meta_size = meta_binary->length();
+            int64_t stale_rowsets_num = tablet_meta_pb.stale_rs_metas().size();
+            tablet_meta_pb.clear_stale_rs_metas();
+            meta_binary->clear();
+            serialize_success = tablet_meta_pb.SerializeToString(meta_binary);
+            LOG(WARNING) << "tablet meta serialization size exceeds limit: "
+                         << config::tablet_meta_serialize_size_limit
+                         << " clean up stale rowsets, tablet id: " << 
tablet_id()
+                         << " stale rowset num: " << stale_rowsets_num
+                         << " serialization size before clean " << 
origin_meta_size
+                         << " serialization size after clean " << 
meta_binary->length();
+        }
+    }
+
     if (!serialize_success) {
         LOG(FATAL) << "failed to serialize meta " << tablet_id();
     }
diff --git a/be/src/olap/tablet_meta.h b/be/src/olap/tablet_meta.h
index 41455c051c7..74ab71d0586 100644
--- a/be/src/olap/tablet_meta.h
+++ b/be/src/olap/tablet_meta.h
@@ -165,6 +165,7 @@ public:
     // Remote disk space occupied by tablet.
     size_t tablet_remote_size() const;
     size_t version_count() const;
+    size_t stale_version_count() const;
     size_t version_count_cross_with_range(const Version& range) const;
     Version max_version() const;
 
@@ -284,6 +285,8 @@ public:
         _ttl_seconds = ttl_seconds;
     }
 
+    int64_t avg_rs_meta_serialize_size() const { return 
_avg_rs_meta_serialize_size; }
+
 private:
     Status _save_meta(DataDir* data_dir);
 
@@ -339,6 +342,8 @@ private:
     int64_t _time_series_compaction_empty_rowsets_threshold = 0;
     int64_t _time_series_compaction_level_threshold = 0;
 
+    int64_t _avg_rs_meta_serialize_size = 0;
+
     // cloud
     int64_t _ttl_seconds = 0;
 
@@ -645,6 +650,10 @@ inline size_t TabletMeta::version_count() const {
     return _rs_metas.size();
 }
 
+inline size_t TabletMeta::stale_version_count() const {
+    return _rs_metas.size();
+}
+
 inline TabletState TabletMeta::tablet_state() const {
     return _tablet_state;
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to