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 4f1d76d6467 handle create rowset error to avoid null pointer exception 
(#30670)
4f1d76d6467 is described below

commit 4f1d76d6467cbddc7af20f723fe034fd5f476733
Author: HHoflittlefish777 <77738092+hhoflittlefish...@users.noreply.github.com>
AuthorDate: Thu Feb 1 11:51:51 2024 +0800

    handle create rowset error to avoid null pointer exception (#30670)
---
 be/src/olap/rowset/beta_rowset_writer.cpp          | 18 +++---
 be/src/olap/rowset/beta_rowset_writer.h            |  2 +-
 .../test_rowset_writer_fault.groovy                | 66 ++++++++++++++++++++++
 3 files changed, 77 insertions(+), 9 deletions(-)

diff --git a/be/src/olap/rowset/beta_rowset_writer.cpp 
b/be/src/olap/rowset/beta_rowset_writer.cpp
index acc77b730ff..89595f6cd17 100644
--- a/be/src/olap/rowset/beta_rowset_writer.cpp
+++ b/be/src/olap/rowset/beta_rowset_writer.cpp
@@ -173,8 +173,9 @@ Status BetaRowsetWriter::_generate_delete_bitmap(int32_t 
segment_id) {
         (_context.partial_update_info && 
_context.partial_update_info->is_partial_update)) {
         return Status::OK();
     }
-    auto rowset = _build_tmp();
-    auto beta_rowset = reinterpret_cast<BetaRowset*>(rowset.get());
+    RowsetSharedPtr rowset_ptr;
+    RETURN_IF_ERROR(_build_tmp(rowset_ptr));
+    auto beta_rowset = reinterpret_cast<BetaRowset*>(rowset_ptr.get());
     std::vector<segment_v2::SegmentSharedPtr> segments;
     RETURN_IF_ERROR(beta_rowset->load_segments(segment_id, segment_id + 1, 
&segments));
     std::vector<RowsetSharedPtr> specified_rowsets;
@@ -184,7 +185,7 @@ Status BetaRowsetWriter::_generate_delete_bitmap(int32_t 
segment_id) {
         specified_rowsets = 
tablet->get_rowset_by_ids(&_context.mow_context->rowset_ids);
     }
     OlapStopWatch watch;
-    RETURN_IF_ERROR(tablet->calc_delete_bitmap(rowset, segments, 
specified_rowsets,
+    RETURN_IF_ERROR(tablet->calc_delete_bitmap(rowset_ptr, segments, 
specified_rowsets,
                                                
_context.mow_context->delete_bitmap,
                                                
_context.mow_context->max_version, nullptr));
     size_t total_rows = std::accumulate(
@@ -657,19 +658,20 @@ void 
BaseBetaRowsetWriter::_build_rowset_meta(std::shared_ptr<RowsetMeta> rowset
     }
 }
 
-RowsetSharedPtr BaseBetaRowsetWriter::_build_tmp() {
+Status BaseBetaRowsetWriter::_build_tmp(RowsetSharedPtr& rowset_ptr) {
     std::shared_ptr<RowsetMeta> rowset_meta_ = std::make_shared<RowsetMeta>();
     rowset_meta_->init(_rowset_meta.get());
     _build_rowset_meta(rowset_meta_);
 
-    RowsetSharedPtr rowset;
     auto status = RowsetFactory::create_rowset(_context.tablet_schema, 
_context.rowset_dir,
-                                               rowset_meta_, &rowset);
+                                               rowset_meta_, &rowset_ptr);
+    DBUG_EXECUTE_IF("BaseBetaRowsetWriter::_build_tmp.create_rowset_failed",
+                    { status = Status::InternalError("create rowset failed"); 
});
     if (!status.ok()) {
         LOG(WARNING) << "rowset init failed when build new rowset, res=" << 
status;
-        return nullptr;
+        return status;
     }
-    return rowset;
+    return Status::OK();
 }
 
 Status BaseBetaRowsetWriter::_create_file_writer(std::string path, 
io::FileWriterPtr& file_writer) {
diff --git a/be/src/olap/rowset/beta_rowset_writer.h 
b/be/src/olap/rowset/beta_rowset_writer.h
index 0bd96f28291..a679817c009 100644
--- a/be/src/olap/rowset/beta_rowset_writer.h
+++ b/be/src/olap/rowset/beta_rowset_writer.h
@@ -141,7 +141,7 @@ protected:
     virtual Status _check_segment_number_limit();
     virtual int64_t _num_seg() const;
     // build a tmp rowset for load segment to calc delete_bitmap for this 
segment
-    RowsetSharedPtr _build_tmp();
+    Status _build_tmp(RowsetSharedPtr& rowset_ptr);
 
     RowsetWriterContext _context;
     std::shared_ptr<RowsetMeta> _rowset_meta;
diff --git 
a/regression-test/suites/fault_injection_p0/test_rowset_writer_fault.groovy 
b/regression-test/suites/fault_injection_p0/test_rowset_writer_fault.groovy
new file mode 100644
index 00000000000..84192e12b51
--- /dev/null
+++ b/regression-test/suites/fault_injection_p0/test_rowset_writer_fault.groovy
@@ -0,0 +1,66 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+suite("test_rowset_writer_fault", "nonConcurrent") {
+    sql """ DROP TABLE IF EXISTS `baseall` """
+    sql """
+        CREATE TABLE IF NOT EXISTS `baseall` (
+            `k0` boolean null comment "",
+            `k1` tinyint(4) null comment "",
+            `k2` smallint(6) null comment "",
+            `k3` int(11) null comment "",
+            `k4` bigint(20) null comment "",
+            `k5` decimal(9, 3) null comment "",
+            `k6` char(5) null comment "",
+            `k10` date null comment "",
+            `k11` datetime null comment "",
+            `k7` varchar(20) null comment "",
+            `k8` double null comment "",
+            `k9` float null comment "",
+            `k12` string null comment "",
+            `k13` largeint(40) null comment ""
+        ) engine=olap
+        UNIQUE KEY (k0)
+        DISTRIBUTED BY HASH(`k1`) BUCKETS 5 properties("replication_num" = "1")
+        """
+        
+    GetDebugPoint().clearDebugPointsForAllBEs()
+    def injection = "BaseBetaRowsetWriter::_build_tmp.create_rowset_failed"
+    try {
+        GetDebugPoint().enableDebugPointForAllBEs(injection)
+        streamLoad {
+            table "baseall"
+            db "regression_test_fault_injection_p0"
+            set 'column_separator', ','
+            file "baseall.txt"
+            check { result, exception, startTime, endTime ->
+                if (exception != null) {
+                    throw exception
+                }
+                log.info("Stream load result: ${result}".toString())
+                def json = parseJson(result)
+                assertEquals("fail", json.Status.toLowerCase())
+            }
+        }
+    } catch(Exception e) {
+        logger.info(e.getMessage())
+        assertTrue(e.getMessage().contains(error_msg))
+    } finally {
+        GetDebugPoint().disableDebugPointForAllBEs(injection)
+    }
+    sql """ DROP TABLE IF EXISTS `baseall` """
+}
\ No newline at end of file


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

Reply via email to