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

yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new e891a095e7e check segment num when build rowset meta (#30803)
e891a095e7e is described below

commit e891a095e7e52461534745969e0b47e82f1cb29c
Author: HHoflittlefish777 <77738092+hhoflittlefish...@users.noreply.github.com>
AuthorDate: Sun Feb 4 18:15:12 2024 +0800

    check segment num when build rowset meta (#30803)
---
 be/src/olap/rowset/beta_rowset_writer.cpp | 35 ++++++++++++++++++++++++-------
 be/src/olap/rowset/beta_rowset_writer.h   |  3 ++-
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp 
b/be/src/olap/rowset/beta_rowset_writer.cpp
index 89595f6cd17..ba6a8a11f97 100644
--- a/be/src/olap/rowset/beta_rowset_writer.cpp
+++ b/be/src/olap/rowset/beta_rowset_writer.cpp
@@ -454,6 +454,7 @@ Status BaseBetaRowsetWriter::add_rowset(RowsetSharedPtr 
rowset) {
     _num_segment += rowset->num_segments();
     // append key_bounds to current rowset
     
RETURN_IF_ERROR(rowset->get_segments_key_bounds(&_segments_encoded_key_bounds));
+
     // TODO update zonemap
     if (rowset->rowset_meta()->has_delete_predicate()) {
         
_rowset_meta->set_delete_predicate(rowset->rowset_meta()->delete_predicate());
@@ -570,7 +571,7 @@ Status BaseBetaRowsetWriter::build(RowsetSharedPtr& rowset) 
{
 
     RETURN_NOT_OK_STATUS_WITH_WARN(_check_segment_number_limit(),
                                    "too many segments when build new rowset");
-    _build_rowset_meta(_rowset_meta);
+    RETURN_IF_ERROR(_build_rowset_meta(_rowset_meta, true));
 
     if (_rowset_meta->newest_write_timestamp() == -1) {
         _rowset_meta->set_newest_write_timestamp(UnixSeconds());
@@ -615,7 +616,8 @@ void 
BaseBetaRowsetWriter::update_rowset_schema(TabletSchemaSPtr flush_schema) {
     VLOG_DEBUG << "dump rs schema: " << 
_context.tablet_schema->dump_structure();
 }
 
-void BaseBetaRowsetWriter::_build_rowset_meta(std::shared_ptr<RowsetMeta> 
rowset_meta) {
+Status BaseBetaRowsetWriter::_build_rowset_meta(std::shared_ptr<RowsetMeta> 
rowset_meta,
+                                                bool check_segment_num) {
     int64_t num_rows_written = 0;
     int64_t total_data_size = 0;
     int64_t total_index_size = 0;
@@ -640,8 +642,19 @@ void 
BaseBetaRowsetWriter::_build_rowset_meta(std::shared_ptr<RowsetMeta> rowset
         rowset_meta->set_segments_overlap(NONOVERLAPPING);
     }
 
-    rowset_meta->set_num_segments(_num_seg());
-    // TODO(zhangzhengyu): key_bounds.size() should equal num_seg, but 
currently not always
+    auto segment_num = _num_seg();
+    if (check_segment_num) {
+        auto segments_encoded_key_bounds_size = 
segments_encoded_key_bounds.size();
+        if (segments_encoded_key_bounds_size != segment_num) {
+            return Status::InternalError(
+                    "segments_encoded_key_bounds_size should  equal to 
_num_seg, "
+                    "segments_encoded_key_bounds_size "
+                    "is: {}, _num_seg is: {}",
+                    segments_encoded_key_bounds_size, segment_num);
+        }
+    }
+
+    rowset_meta->set_num_segments(segment_num);
     rowset_meta->set_num_rows(num_rows_written + _num_rows_written);
     rowset_meta->set_total_disk_size(total_data_size + _total_data_size);
     rowset_meta->set_data_disk_size(total_data_size + _total_data_size);
@@ -656,15 +669,23 @@ void 
BaseBetaRowsetWriter::_build_rowset_meta(std::shared_ptr<RowsetMeta> rowset
     } else {
         rowset_meta->set_rowset_state(VISIBLE);
     }
+
+    return Status::OK();
 }
 
 Status BaseBetaRowsetWriter::_build_tmp(RowsetSharedPtr& rowset_ptr) {
+    Status status;
     std::shared_ptr<RowsetMeta> rowset_meta_ = std::make_shared<RowsetMeta>();
     rowset_meta_->init(_rowset_meta.get());
-    _build_rowset_meta(rowset_meta_);
 
-    auto status = RowsetFactory::create_rowset(_context.tablet_schema, 
_context.rowset_dir,
-                                               rowset_meta_, &rowset_ptr);
+    status = _build_rowset_meta(rowset_meta_);
+    if (!status.ok()) {
+        LOG(WARNING) << "failed to build rowset meta, res=" << status;
+        return status;
+    }
+
+    status = RowsetFactory::create_rowset(_context.tablet_schema, 
_context.rowset_dir, rowset_meta_,
+                                          &rowset_ptr);
     DBUG_EXECUTE_IF("BaseBetaRowsetWriter::_build_tmp.create_rowset_failed",
                     { status = Status::InternalError("create rowset failed"); 
});
     if (!status.ok()) {
diff --git a/be/src/olap/rowset/beta_rowset_writer.h 
b/be/src/olap/rowset/beta_rowset_writer.h
index a679817c009..d67084d1b3a 100644
--- a/be/src/olap/rowset/beta_rowset_writer.h
+++ b/be/src/olap/rowset/beta_rowset_writer.h
@@ -130,7 +130,8 @@ public:
 
 private:
     virtual Status _generate_delete_bitmap(int32_t segment_id) = 0;
-    void _build_rowset_meta(std::shared_ptr<RowsetMeta> rowset_meta);
+    Status _build_rowset_meta(std::shared_ptr<RowsetMeta> rowset_meta,
+                              bool check_segment_num = false);
 
     void update_rowset_schema(TabletSchemaSPtr flush_schema);
     // build a tmp rowset for load segment to calc delete_bitmap


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

Reply via email to