Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions be/src/common/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1305,6 +1305,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
Expand Down
2 changes: 2 additions & 0 deletions be/src/common/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
11 changes: 11 additions & 0 deletions be/src/olap/push_handler.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
10 changes: 10 additions & 0 deletions be/src/olap/rowset_builder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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", {
Expand Down
2 changes: 1 addition & 1 deletion be/src/olap/schema_change.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
11 changes: 11 additions & 0 deletions be/src/olap/tablet.h
Original file line number Diff line number Diff line change
Expand Up @@ -148,6 +148,7 @@ class Tablet final : public BaseTablet {

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;
Expand All @@ -164,6 +165,7 @@ class Tablet final : public BaseTablet {
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);
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -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
21 changes: 21 additions & 0 deletions be/src/olap/tablet_meta.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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();
}
Expand Down
9 changes: 9 additions & 0 deletions be/src/olap/tablet_meta.h
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,7 @@ class TabletMeta {
// 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;

Expand Down Expand Up @@ -284,6 +285,8 @@ class TabletMeta {
_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);

Expand Down Expand Up @@ -339,6 +342,8 @@ class TabletMeta {
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;

Expand Down Expand Up @@ -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;
}
Expand Down