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

eldenmoon 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 1acbbbdd8e8 [improve](ip)improve data type ip for rowstore and 
trycatch in segment_flusher (#39258)
1acbbbdd8e8 is described below

commit 1acbbbdd8e89f319914ecf835f596653a565b371
Author: amory <wangqian...@selectdb.com>
AuthorDate: Wed Aug 14 09:57:02 2024 +0800

    [improve](ip)improve data type ip for rowstore and trycatch in 
segment_flusher (#39258)
    
    before we not support ipv6 with rowstore, and can make coredump like
    this:
    ```
    terminate called after throwing an instance of 'doris::Exception'
      what():  [E3] write_one_cell_to_jsonb with type IPv6
    *** Query id: e5e020df4ea04a70-95a27c948db5a518 ***
    *** is nereids: 0 ***
    *** tablet id: 9008975 ***
    *** Aborted at 1723184823 (unix time) try "date -d @1723184823" if you are 
using GNU date ***
    *** Current BE git commitID: a2baaf3174 ***
    *** SIGABRT unknown detail explain (@0x29f794) received by PID 2750356 (TID 
2752049 OR 0x7f6064dec640) from PID 2750356; stack trace: ***
     0# doris::signal::(anonymous namespace)::FailureSignalHandler(int, 
siginfo_t*, void*) at 
/home/zcp/repo_center/doris_master/doris/be/src/common/signal_handler.h:421
     1# 0x00007F6499586520 in /lib/x86_64-linux-gnu/libc.so.6
     2# pthread_kill at ./nptl/pthread_kill.c:89
     3# raise at ../sysdeps/posix/raise.c:27
     4# abort at ./stdlib/abort.c:81
     5# __gnu_cxx::__verbose_terminate_handler() [clone .cold] at 
../../../../libstdc++-v3/libsupc++/vterminate.cc:75
     6# __cxxabiv1::__terminate(void (*)()) at 
../../../../libstdc++-v3/libsupc++/eh_terminate.cc:48
     7# 0x00005610407949C1 in /mnt/hdd01/PERFORMANCE_ENV/be/lib/doris_be
     8# 0x0000561040794B14 in /mnt/hdd01/PERFORMANCE_ENV/be/lib/doris_be
     9# doris::vectorized::DataTypeNumberSerDe<unsigned 
__int128>::write_one_cell_to_jsonb(doris::vectorized::IColumn const&, 
doris::JsonbWriterT<doris::JsonbOutStream>&, doris::vectorized::Arena*, int, 
int) const in /mnt/hdd01/PERFORMANCE_ENV/be/lib/doris_be
    10# 
doris::vectorized::JsonbSerializeUtil::block_to_jsonb(doris::TabletSchema 
const&, doris::vectorized::Block const&, doris::vectorized::ColumnStr<unsigned 
int>&, int, std::vector<std::shared_ptr<doris::vectorized::DataTypeSerDe>, 
std::allocator<std::shared_ptr<doris::vectorized::DataTypeSerDe> > > const&, 
std::unordered_set<int, std::hash<int>, std::equal_to<int>, std::allocator<int> 
> const&) at 
/home/zcp/repo_center/doris_master/doris/be/src/vec/jsonb/serialize.cpp:57
    11# 
doris::segment_v2::VerticalSegmentWriter::_serialize_block_to_row_column(doris::vectorized::Block&)
 at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp:302
    12# doris::segment_v2::VerticalSegmentWriter::write_batch() at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/rowset/segment_v2/vertical_segment_writer.cpp:839
    13# 
doris::SegmentFlusher::_add_rows(std::unique_ptr<doris::segment_v2::VerticalSegmentWriter,
 std::default_delete<doris::segment_v2::VerticalSegmentWriter> >&, 
doris::vectorized::Block const*, unsigned long, unsigned long) at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/rowset/segment_creator.cpp:130
    14# doris::SegmentFlusher::flush_single_block(doris::vectorized::Block 
const*, int, long*) at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/rowset/segment_creator.cpp:73
    15# doris::SegmentCreator::flush_single_block(doris::vectorized::Block 
const*, int, long*) at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/rowset/segment_creator.cpp:395
    16# doris::BetaRowsetWriterV2::flush_memtable(doris::vectorized::Block*, 
int, long*) at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/rowset/beta_rowset_writer_v2.cpp:101
    17# doris::FlushToken::_do_flush_memtable(doris::MemTable*, int, long*) at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/memtable_flush_executor.cpp:148
    18# doris::FlushToken::_flush_memtable(std::unique_ptr<doris::MemTable, 
std::default_delete<doris::MemTable> >, int, long) in 
/mnt/hdd01/PERFORMANCE_ENV/be/lib/doris_be
    19# doris::MemtableFlushTask::run() at 
/home/zcp/repo_center/doris_master/doris/be/src/olap/memtable_flush_executor.cpp:63
    20# doris::ThreadPool::dispatch_thread() in 
/mnt/hdd01/PERFORMANCE_ENV/be/lib/doris_be
    21# doris::Thread::supervise_thread(void*) at 
/home/zcp/repo_center/doris_master/doris/be/src/util/thread.cpp:499
    22# start_thread at ./nptl/pthread_create.c:442
    23# 0x00007F649966A850 at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:83
    ```
---
 be/src/olap/rowset/segment_creator.cpp             |  5 +++--
 .../vec/data_types/serde/data_type_ipv6_serde.cpp  | 22 ++++++++++++++++++++++
 be/src/vec/data_types/serde/data_type_ipv6_serde.h |  3 +++
 .../data/mv_p0/test_row_store/test_row_store.out   |  4 ++++
 .../mv_p0/test_row_store/test_row_store.groovy     | 19 +++++++++++++++++++
 5 files changed, 51 insertions(+), 2 deletions(-)

diff --git a/be/src/olap/rowset/segment_creator.cpp 
b/be/src/olap/rowset/segment_creator.cpp
index 40f6e8303fe..5e5dfc3733f 100644
--- a/be/src/olap/rowset/segment_creator.cpp
+++ b/be/src/olap/rowset/segment_creator.cpp
@@ -27,6 +27,7 @@
 
 #include "common/compiler_util.h" // IWYU pragma: keep
 #include "common/config.h"
+#include "common/exception.h"
 #include "common/logging.h"
 #include "common/status.h"
 #include "io/fs/file_writer.h"
@@ -70,12 +71,12 @@ Status SegmentFlusher::flush_single_block(const 
vectorized::Block* block, int32_
         _context.tablet_schema->cluster_key_idxes().empty()) {
         std::unique_ptr<segment_v2::VerticalSegmentWriter> writer;
         RETURN_IF_ERROR(_create_segment_writer(writer, segment_id, 
no_compression));
-        RETURN_IF_ERROR(_add_rows(writer, &flush_block, 0, 
flush_block.rows()));
+        RETURN_IF_ERROR_OR_CATCH_EXCEPTION(_add_rows(writer, &flush_block, 0, 
flush_block.rows()));
         RETURN_IF_ERROR(_flush_segment_writer(writer, writer->flush_schema(), 
flush_size));
     } else {
         std::unique_ptr<segment_v2::SegmentWriter> writer;
         RETURN_IF_ERROR(_create_segment_writer(writer, segment_id, 
no_compression));
-        RETURN_IF_ERROR(_add_rows(writer, &flush_block, 0, 
flush_block.rows()));
+        RETURN_IF_ERROR_OR_CATCH_EXCEPTION(_add_rows(writer, &flush_block, 0, 
flush_block.rows()));
         RETURN_IF_ERROR(_flush_segment_writer(writer, writer->flush_schema(), 
flush_size));
     }
     return Status::OK();
diff --git a/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp 
b/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp
index 88251a5d5d3..f09b6feb4a2 100644
--- a/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp
+++ b/be/src/vec/data_types/serde/data_type_ipv6_serde.cpp
@@ -68,6 +68,28 @@ Status DataTypeIPv6SerDe::write_column_to_mysql(const 
IColumn& column,
     return _write_column_to_mysql(column, row_buffer, row_idx, col_const, 
options);
 }
 
+void DataTypeIPv6SerDe::read_one_cell_from_jsonb(IColumn& column, const 
JsonbValue* arg) const {
+    IPv6 val = 0;
+    const auto* str_value = static_cast<const JsonbStringVal*>(arg);
+    ReadBuffer rb(reinterpret_cast<const unsigned char*>(str_value->getBlob()),
+                  str_value->getBlobLen());
+    if (!read_ipv6_text_impl(val, rb)) {
+        throw doris::Exception(ErrorCode::INVALID_ARGUMENT, "parse ipv6 fail, 
string: '{}'",
+                               rb.to_string());
+    }
+    assert_cast<ColumnIPv6&>(column).insert_value(val);
+}
+
+void DataTypeIPv6SerDe::write_one_cell_to_jsonb(const IColumn& column,
+                                                JsonbWriterT<JsonbOutStream>& 
result,
+                                                Arena* mem_pool, int col_id, 
int row_num) const {
+    // we make ipv6 as string in jsonb
+    result.writeKey(col_id);
+    IPv6 data = assert_cast<const ColumnIPv6&>(column).get_element(row_num);
+    IPv6Value ipv6_value(data);
+    result.writeString(ipv6_value.to_string());
+}
+
 Status DataTypeIPv6SerDe::serialize_one_cell_to_json(const IColumn& column, 
int row_num,
                                                      BufferWritable& bw,
                                                      FormatOptions& options) 
const {
diff --git a/be/src/vec/data_types/serde/data_type_ipv6_serde.h 
b/be/src/vec/data_types/serde/data_type_ipv6_serde.h
index 71f86f383b4..d308da41859 100644
--- a/be/src/vec/data_types/serde/data_type_ipv6_serde.h
+++ b/be/src/vec/data_types/serde/data_type_ipv6_serde.h
@@ -67,6 +67,9 @@ public:
                                const cctz::time_zone& ctz) const override;
     void read_column_from_arrow(IColumn& column, const arrow::Array* 
arrow_array, int start,
                                 int end, const cctz::time_zone& ctz) const 
override;
+    void read_one_cell_from_jsonb(IColumn& column, const JsonbValue* arg) 
const override;
+    void write_one_cell_to_jsonb(const IColumn& column, 
JsonbWriterT<JsonbOutStream>& result,
+                                 Arena* mem_pool, int unique_id, int row_num) 
const override;
 
 private:
     template <bool is_binary_format>
diff --git a/regression-test/data/mv_p0/test_row_store/test_row_store.out 
b/regression-test/data/mv_p0/test_row_store/test_row_store.out
new file mode 100644
index 00000000000..42f6adba1f1
--- /dev/null
+++ b/regression-test/data/mv_p0/test_row_store/test_row_store.out
@@ -0,0 +1,4 @@
+-- This file is automatically generated. You should know what you did if you 
want to edit this
+-- !sql --
+1      ::      0.0.0.0
+
diff --git a/regression-test/suites/mv_p0/test_row_store/test_row_store.groovy 
b/regression-test/suites/mv_p0/test_row_store/test_row_store.groovy
index 99cc3ba227e..b9ee72c5053 100644
--- a/regression-test/suites/mv_p0/test_row_store/test_row_store.groovy
+++ b/regression-test/suites/mv_p0/test_row_store/test_row_store.groovy
@@ -29,4 +29,23 @@ suite ("test_row_store") {
         sql "create materialized view kavg as select k1,k4,avg(k2) from 
d_table group by k1,k4;"
         exception "RowStore table can't create materialized view"
     }
+
+    // test ip type with row store
+    sql """ DROP TABLE IF EXISTS ipv_row; """
+    sql """ CREATE TABLE ipv_row (
+             `id` int,
+             `ip_v6` ipv6,
+             `ip_v4` ipv4
+            ) ENGINE=OLAP
+            DISTRIBUTED BY HASH(`id`) BUCKETS 4
+            PROPERTIES (
+                 "store_row_column"="true",
+                 "replication_allocation" = "tag.location.default: 1"
+            ); """
+
+    // rowstore column can't  make inde
+    sql """ insert into ipv_row values(2, '2001:16a0:2:200a::2', 
'192.1.2.0');"""
+    sql """ insert into ipv_row values(1, '::', '0.0.0.0');"""
+    qt_sql """select * from ipv_row where id = 1;"""
+
 }


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

Reply via email to