pick master #39455
This commit is contained in:
@ -1270,6 +1270,13 @@ DEFINE_mBool(enable_parquet_page_index, "false");
|
||||
|
||||
DEFINE_mBool(ignore_not_found_file_in_external_table, "true");
|
||||
|
||||
// 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
|
||||
|
||||
@ -1360,6 +1360,8 @@ DECLARE_mBool(enable_parquet_page_index);
|
||||
// Default is true, if set to false, the not found file will result in query failure.
|
||||
DECLARE_mBool(ignore_not_found_file_in_external_table);
|
||||
|
||||
DECLARE_mInt64(tablet_meta_serialize_size_limit);
|
||||
|
||||
DECLARE_mInt64(pipeline_task_leakage_detect_period_secs);
|
||||
|
||||
#ifdef BE_TEST
|
||||
|
||||
@ -167,6 +167,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) {
|
||||
|
||||
@ -188,6 +188,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", {
|
||||
|
||||
@ -878,7 +878,7 @@ Status SchemaChangeHandler::_do_process_alter_tablet_v2(const TAlterTabletReqV2&
|
||||
}
|
||||
}
|
||||
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);
|
||||
|
||||
@ -142,6 +142,7 @@ public:
|
||||
size_t num_rows();
|
||||
int version_count() const;
|
||||
bool exceed_version_limit(int32_t limit) const override;
|
||||
int stale_version_count() const;
|
||||
uint64_t segment_count() const;
|
||||
Version max_version() const;
|
||||
Version max_version_unlocked() const;
|
||||
@ -158,6 +159,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);
|
||||
@ -827,6 +829,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();
|
||||
@ -885,4 +892,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
|
||||
|
||||
@ -26,10 +26,12 @@
|
||||
#include <json2pb/pb_to_json.h>
|
||||
#include <time.h>
|
||||
|
||||
#include <cstdint>
|
||||
#include <set>
|
||||
#include <utility>
|
||||
|
||||
#include "common/config.h"
|
||||
#include "gutil/integral_types.h"
|
||||
#include "io/fs/file_writer.h"
|
||||
#include "olap/data_dir.h"
|
||||
#include "olap/file_header.h"
|
||||
@ -504,6 +506,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();
|
||||
}
|
||||
|
||||
@ -166,6 +166,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;
|
||||
|
||||
@ -269,6 +270,8 @@ public:
|
||||
return _time_series_compaction_level_threshold;
|
||||
}
|
||||
|
||||
int64_t avg_rs_meta_serialize_size() const { return _avg_rs_meta_serialize_size; }
|
||||
|
||||
private:
|
||||
Status _save_meta(DataDir* data_dir);
|
||||
|
||||
@ -323,6 +326,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;
|
||||
|
||||
mutable std::shared_mutex _meta_lock;
|
||||
};
|
||||
|
||||
@ -620,6 +625,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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user