From f174a304f2723b77bcf3de2614af1ba54613604f Mon Sep 17 00:00:00 2001 From: yiguolei <676222867@qq.com> Date: Wed, 28 Aug 2024 21:05:11 +0800 Subject: [PATCH 1/6] [enhancement](exception) pageio method should return error when allocate memory failed (#40020) ## Proposed changes 1. pageio method should return error when allocate memory failed just for point query. 2. variant parsing logic should return error when allocate memory failed. --------- Co-authored-by: yiguolei --- be/src/olap/rowset/segment_creator.cpp | 2 +- be/src/olap/rowset/segment_creator.h | 6 +++++- be/src/olap/rowset/segment_v2/page_io.cpp | 4 ++-- be/src/olap/rowset/segment_v2/page_io.h | 11 ++++++++++- be/src/vec/common/schema_util.cpp | 14 ++++---------- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/be/src/olap/rowset/segment_creator.cpp b/be/src/olap/rowset/segment_creator.cpp index c657238c0208866..1afd3215db42f62 100644 --- a/be/src/olap/rowset/segment_creator.cpp +++ b/be/src/olap/rowset/segment_creator.cpp @@ -83,7 +83,7 @@ Status SegmentFlusher::flush_single_block(const vectorized::Block* block, int32_ return Status::OK(); } -Status SegmentFlusher::_parse_variant_columns(vectorized::Block& block) { +Status SegmentFlusher::_internal_parse_variant_columns(vectorized::Block& block) { size_t num_rows = block.rows(); if (num_rows == 0) { return Status::OK(); diff --git a/be/src/olap/rowset/segment_creator.h b/be/src/olap/rowset/segment_creator.h index 961e161853c1b72..c862fce87a43bdc 100644 --- a/be/src/olap/rowset/segment_creator.h +++ b/be/src/olap/rowset/segment_creator.h @@ -141,7 +141,11 @@ class SegmentFlusher { bool need_buffering(); private: - Status _parse_variant_columns(vectorized::Block& block); + // This method will catch exception when allocate memory failed + Status _parse_variant_columns(vectorized::Block& block) { + RETURN_IF_CATCH_EXCEPTION({ return _internal_parse_variant_columns(block); }); + } + Status _internal_parse_variant_columns(vectorized::Block& block); Status _add_rows(std::unique_ptr& segment_writer, const vectorized::Block* block, size_t row_offset, size_t row_num); Status _add_rows(std::unique_ptr& segment_writer, diff --git a/be/src/olap/rowset/segment_v2/page_io.cpp b/be/src/olap/rowset/segment_v2/page_io.cpp index cea4a23f7421783..07d5656ee8a44b1 100644 --- a/be/src/olap/rowset/segment_v2/page_io.cpp +++ b/be/src/olap/rowset/segment_v2/page_io.cpp @@ -111,8 +111,8 @@ Status PageIO::write_page(io::FileWriter* writer, const std::vector& body return Status::OK(); } -Status PageIO::read_and_decompress_page(const PageReadOptions& opts, PageHandle* handle, - Slice* body, PageFooterPB* footer) { +Status PageIO::read_and_decompress_page_(const PageReadOptions& opts, PageHandle* handle, + Slice* body, PageFooterPB* footer) { opts.sanity_check(); opts.stats->total_pages_num++; diff --git a/be/src/olap/rowset/segment_v2/page_io.h b/be/src/olap/rowset/segment_v2/page_io.h index 736b3e521f6800d..b23af4b0b350e5c 100644 --- a/be/src/olap/rowset/segment_v2/page_io.h +++ b/be/src/olap/rowset/segment_v2/page_io.h @@ -123,8 +123,17 @@ class PageIO { // `handle' holds the memory of page data, // `body' points to page body, // `footer' stores the page footer. + // This method is exception safe, it will failed when allocate memory failed. static Status read_and_decompress_page(const PageReadOptions& opts, PageHandle* handle, - Slice* body, PageFooterPB* footer); + Slice* body, PageFooterPB* footer) { + RETURN_IF_CATCH_EXCEPTION( + { return read_and_decompress_page_(opts, handle, body, footer); }); + } + +private: + // An internal method that not deal with exception. + static Status read_and_decompress_page_(const PageReadOptions& opts, PageHandle* handle, + Slice* body, PageFooterPB* footer); }; } // namespace segment_v2 diff --git a/be/src/vec/common/schema_util.cpp b/be/src/vec/common/schema_util.cpp index 4d470ccc3b73b63..c0b48e01307012d 100644 --- a/be/src/vec/common/schema_util.cpp +++ b/be/src/vec/common/schema_util.cpp @@ -530,16 +530,10 @@ Status _parse_variant_columns(Block& block, const std::vector& variant_pos, Status parse_variant_columns(Block& block, const std::vector& variant_pos, const ParseConfig& config) { - try { - // Parse each variant column from raw string column - RETURN_IF_ERROR( - vectorized::schema_util::_parse_variant_columns(block, variant_pos, config)); - } catch (const doris::Exception& e) { - // TODO more graceful, max_filter_ratio - LOG(WARNING) << "encounter execption " << e.to_string(); - return Status::InternalError(e.to_string()); - } - return Status::OK(); + // Parse each variant column from raw string column + RETURN_IF_CATCH_EXCEPTION({ + return vectorized::schema_util::_parse_variant_columns(block, variant_pos, config); + }); } Status encode_variant_sparse_subcolumns(ColumnObject& column) { From 2d17e6ed52277fdc6ad2701a13ac017b0434dd34 Mon Sep 17 00:00:00 2001 From: zhengyu Date: Wed, 28 Aug 2024 21:21:41 +0800 Subject: [PATCH 2/6] [ut](filecache) fix try_any_cast error in UTs (#40039) ## Proposed changes Issue Number: close #xxx --------- Signed-off-by: freemandealer --- be/test/io/fs/s3_file_writer_test.cpp | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/be/test/io/fs/s3_file_writer_test.cpp b/be/test/io/fs/s3_file_writer_test.cpp index 782ef80121a6451..ab76fb54347d275 100644 --- a/be/test/io/fs/s3_file_writer_test.cpp +++ b/be/test/io/fs/s3_file_writer_test.cpp @@ -944,10 +944,9 @@ TEST_F(S3FileWriterTest, multi_part_complete_error_2) { sp->set_call_back("S3FileWriter::_complete:2", [](auto&& outcome) { // Deliberately make one upload one part task fail to test if s3 file writer could // handle io error - auto* parts = try_any_cast>*>( - outcome.back()); + auto* parts = try_any_cast*>(outcome.back()); size_t size = parts->size(); - parts->back()->SetPartNumber(size + 2); + parts->back().part_num = (size + 2); }); Defer defer {[&]() { sp->clear_call_back("S3FileWriter::_complete:2"); }}; auto client = s3_fs->client_holder(); @@ -992,8 +991,8 @@ TEST_F(S3FileWriterTest, multi_part_complete_error_1) { sp->set_call_back("S3FileWriter::_complete:1", [](auto&& outcome) { // Deliberately make one upload one part task fail to test if s3 file writer could // handle io error - const auto& points = try_any_cast>*>&>( + const auto& points = try_any_cast< + const std::pair*>&>( outcome.back()); (*points.first) = false; points.second->pop_back(); From 643eb973d06811ded99ac88e4c6899edc786940f Mon Sep 17 00:00:00 2001 From: walter Date: Wed, 28 Aug 2024 21:34:20 +0800 Subject: [PATCH 3/6] [fix](nereids) Fix add column syntax (#39997) The original parser allows the column_definition_list only to have one column_definition, this PR makes the nereids parser compatible with the legacy one. --------- Co-authored-by: morrySnow <101034200+morrySnow@users.noreply.github.com> --- .../org/apache/doris/nereids/DorisParser.g4 | 2 +- .../nereids_syntax_p0/ddl/add_column.groovy | 49 +++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 regression-test/suites/nereids_syntax_p0/ddl/add_column.groovy diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 2b0e5f1a561227f..1c695f29c329d23 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -237,7 +237,7 @@ addRollupClause alterTableClause : ADD COLUMN columnDef columnPosition? toRollup? properties=propertyClause? #addColumnClause - | ADD COLUMN LEFT_PAREN columnDef (COMMA columnDef) RIGHT_PAREN + | ADD COLUMN LEFT_PAREN columnDef (COMMA columnDef)* RIGHT_PAREN toRollup? properties=propertyClause? #addColumnsClause | DROP COLUMN name=identifier fromRollup? properties=propertyClause? #dropColumnClause | MODIFY COLUMN columnDef columnPosition? fromRollup? diff --git a/regression-test/suites/nereids_syntax_p0/ddl/add_column.groovy b/regression-test/suites/nereids_syntax_p0/ddl/add_column.groovy new file mode 100644 index 000000000000000..f38b4883fc6a9ea --- /dev/null +++ b/regression-test/suites/nereids_syntax_p0/ddl/add_column.groovy @@ -0,0 +1,49 @@ +// 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("add_column") { + def tableName ="test" + + sql 'set enable_nereids_planner=true' + sql 'set enable_fallback_to_original_planner=false' + + sql """ + drop table if exists test + """ + + sql """ + CREATE TABLE IF NOT EXISTS `test` ( + `id` bigint(20) NOT NULL, + `count` bigint(20) NOT NULL, + ) ENGINE=OLAP + UNIQUE KEY(`id`) + COMMENT 'OLAP' + DISTRIBUTED BY HASH(`id`) BUCKETS 5 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1", + "in_memory" = "false", + "storage_format" = "V2", + "disable_auto_compaction" = "false" + ); + """ + + sql """ + ALTER TABLE `test` + ADD COLUMN (`cost` VARCHAR(256) DEFAULT "add"); + """ +} + From 781a9942205271f51775334595a99d894c3416f6 Mon Sep 17 00:00:00 2001 From: Gavin Chou Date: Wed, 28 Aug 2024 21:40:02 +0800 Subject: [PATCH 4/6] [chore](build) Skip cloud module for arm64 (aarch64) in build-for-release.sh (#39804) --- build-for-release.sh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build-for-release.sh b/build-for-release.sh index 4d9a257bd2eb67e..2347f9ebaab5e11 100755 --- a/build-for-release.sh +++ b/build-for-release.sh @@ -164,7 +164,11 @@ cp -R "${ORI_OUTPUT}"/apache_hdfs_broker "${OUTPUT_EXT}"/apache_hdfs_broker cp -R "${ORI_OUTPUT}"/be/* "${OUTPUT_BE}"/ # CLOUD -cp -R "${ORI_OUTPUT}"/ms/* "${OUTPUT_CLOUD}"/ +if [[ "${ARCH}" == "arm64" ]]; then + echo "WARNING: Cloud module is not supported on ARM platform, will skip building it." +else + cp -R "${ORI_OUTPUT}"/ms/* "${OUTPUT_CLOUD}"/ +fi if [[ "${TAR}" -eq 1 ]]; then echo "Begin to compress" From ddc6b81c840ef94f6123cce18b81e901354a661e Mon Sep 17 00:00:00 2001 From: qiye Date: Wed, 28 Aug 2024 21:57:30 +0800 Subject: [PATCH 5/6] [improve](ES Catalog)Only push down literal expr in binary predicate (#39845) ## Proposed changes 1. Add support for reverse binary predicate, such as ` 3 >= k3`. 2. Only push down literal expr in binary predicate This only affects old planner, new planner dose not have any bug. We add check here to make the push down to ES more robust. --- .../doris/datasource/es/QueryBuilders.java | 77 ++++++++++++++----- .../elasticsearch/QueryBuildersTest.java | 27 +++++++ 2 files changed, 86 insertions(+), 18 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/es/QueryBuilders.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/es/QueryBuilders.java index 3a54e012a32733d..19930bb2b14a880 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/es/QueryBuilders.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/es/QueryBuilders.java @@ -31,6 +31,7 @@ import org.apache.doris.analysis.LargeIntLiteral; import org.apache.doris.analysis.LikePredicate; import org.apache.doris.analysis.LikePredicate.Operator; +import org.apache.doris.analysis.LiteralExpr; import org.apache.doris.analysis.SlotRef; import org.apache.doris.catalog.EsResource; import org.apache.doris.thrift.TExprOpcode; @@ -127,9 +128,24 @@ public static QueryBuilder toEsDsl(Expr expr) { .build()); } - private static QueryBuilder parseBinaryPredicate(Expr expr, TExprOpcode opCode, String column, + private static TExprOpcode flipOpCode(TExprOpcode opCode) { + switch (opCode) { + case GE: + return TExprOpcode.LE; + case GT: + return TExprOpcode.LT; + case LE: + return TExprOpcode.GE; + case LT: + return TExprOpcode.GT; + default: + return opCode; + } + } + + private static QueryBuilder parseBinaryPredicate(LiteralExpr expr, TExprOpcode opCode, String column, boolean needDateCompat) { - Object value = toDorisLiteral(expr.getChild(1)); + Object value = toDorisLiteral(expr); if (needDateCompat) { value = compatDefaultDate(value); } @@ -223,6 +239,20 @@ private static QueryBuilder parseFunctionCallExpr(Expr expr) { return new QueryBuilders.EsQueryBuilder(stringValue); } + private static String getColumnFromExpr(Expr expr) { + // Type transformed cast can not pushdown + if (expr instanceof CastExpr) { + Expr withoutCastExpr = exprWithoutCast(expr); + if (withoutCastExpr.getType().equals(expr.getType()) + || (withoutCastExpr.getType().isFloatingPointType() && expr.getType().isFloatingPointType())) { + return ((SlotRef) withoutCastExpr).getColumnName(); + } + } else if (expr instanceof SlotRef) { + return ((SlotRef) expr).getColumnName(); + } + return null; + } + /** * Doris expr to es dsl. **/ @@ -241,32 +271,43 @@ public static QueryBuilder toEsDsl(Expr expr, List notPushDownList, Map= 3 - if (withoutCastExpr.getType().equals(leftExpr.getType()) || (withoutCastExpr.getType().isFloatingPointType() - && leftExpr.getType().isFloatingPointType())) { - column = ((SlotRef) withoutCastExpr).getColumnName(); - } else { - notPushDownList.add(expr); - return null; - } - } else if (leftExpr instanceof SlotRef) { - column = ((SlotRef) leftExpr).getColumnName(); - } else { + String column = getColumnFromExpr(leftExpr); + + if (StringUtils.isEmpty(column)) { + Expr rightExpr = expr.getChild(1); + column = getColumnFromExpr(rightExpr); + opCode = flipOpCode(opCode); + isFlip = true; + } + + if (StringUtils.isEmpty(column)) { notPushDownList.add(expr); return null; } + // Check whether the date type need compat, it must before keyword replace. List needCompatDateFields = builderOptions.getNeedCompatDateFields(); boolean needDateCompat = needCompatDateFields != null && needCompatDateFields.contains(column); // Replace col with col.keyword if mapping exist. column = fieldsContext.getOrDefault(column, column); if (expr instanceof BinaryPredicate) { - return parseBinaryPredicate(expr, opCode, column, needDateCompat); + BinaryPredicate binaryPredicate = (BinaryPredicate) expr; + Expr value; + if (isFlip) { + value = binaryPredicate.getChild(0); + } else { + value = binaryPredicate.getChild(1); + } + // only push down literal expr to ES + if (value instanceof LiteralExpr) { + LiteralExpr literalExpr = (LiteralExpr) value; + return parseBinaryPredicate(literalExpr, opCode, column, needDateCompat); + } else { + notPushDownList.add(expr); + return null; + } } if (expr instanceof IsNullPredicate) { return parseIsNullPredicate(expr, column); diff --git a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java index 3cf9261b9325add..ca5344990e7ec75 100644 --- a/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java +++ b/fe/fe-core/src/test/java/org/apache/doris/external/elasticsearch/QueryBuildersTest.java @@ -209,6 +209,33 @@ public void testCastConvertEsDsl() { new FloatLiteral(3.0, Type.DOUBLE)); QueryBuilders.toEsDsl(castDoublePredicate, notPushDownList, fieldsContext, builderOptions); Assertions.assertEquals(3, notPushDownList.size()); + + SlotRef k4 = new SlotRef(null, "k4"); + k4.setType(Type.FLOAT); + CastExpr castFloatExpr = new CastExpr(Type.FLOAT, k4); + BinaryPredicate castFloatPredicate = new BinaryPredicate(Operator.GE, new FloatLiteral(3.0, Type.FLOAT), + castFloatExpr); + QueryBuilders.QueryBuilder queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate, notPushDownList, fieldsContext, builderOptions); + Assertions.assertEquals("{\"range\":{\"k4\":{\"lte\":3.0}}}", queryBuilder.toJson()); + Assertions.assertEquals(3, notPushDownList.size()); + + castFloatPredicate = new BinaryPredicate(Operator.LE, new FloatLiteral(3.0, Type.FLOAT), + castFloatExpr); + queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate, notPushDownList, fieldsContext, builderOptions); + Assertions.assertEquals("{\"range\":{\"k4\":{\"gte\":3.0}}}", queryBuilder.toJson()); + Assertions.assertEquals(3, notPushDownList.size()); + + castFloatPredicate = new BinaryPredicate(Operator.LT, new FloatLiteral(3.0, Type.FLOAT), + castFloatExpr); + queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate, notPushDownList, fieldsContext, builderOptions); + Assertions.assertEquals("{\"range\":{\"k4\":{\"gt\":3.0}}}", queryBuilder.toJson()); + Assertions.assertEquals(3, notPushDownList.size()); + + castFloatPredicate = new BinaryPredicate(Operator.GT, new FloatLiteral(3.0, Type.FLOAT), + castFloatExpr); + queryBuilder = QueryBuilders.toEsDsl(castFloatPredicate, notPushDownList, fieldsContext, builderOptions); + Assertions.assertEquals("{\"range\":{\"k4\":{\"lt\":3.0}}}", queryBuilder.toJson()); + Assertions.assertEquals(3, notPushDownList.size()); } From d09a39b0530855624f6f59ae116b57b3009094e9 Mon Sep 17 00:00:00 2001 From: Xinyi Zou Date: Wed, 28 Aug 2024 22:05:11 +0800 Subject: [PATCH 6/6] [fix](memory) Fix OwnedSlice free memory (#40043) ``` I20240828 11:41:58.529152 20190 mem_tracker_limiter.cpp:193] [Address Sanitizer] memory buf not exist, mem tracker label: Load#Id=ac42f13dd1430d2c-bd60f5a4829d0792, consumption: 13054587, peak consumption: 13054587, buf: 0, size: 0, stack_trace: 0# doris::OwnedSlice::~OwnedSlice() 1# doris::segment_v2::ScalarColumnWriter::finish_current_page() 2# doris::segment_v2::ScalarColumnWriter::finish() 3# doris::segment_v2::VerticalSegmentWriter::write_batch() 4# doris::SegmentFlusher::_add_rows(std::unique_ptr >&, doris::vectorized::Block const*, unsigned long, unsigned long) 5# doris::SegmentFlusher::flush_single_block(doris::vectorized::Block const*, int, long*) 6# doris::SegmentCreator::flush_single_block(doris::vectorized::Block const*, int, long*) 7# doris::BaseBetaRowsetWriter::flush_memtable(doris::vectorized::Block*, int, long*) 8# doris::FlushToken::_do_flush_memtable(doris::MemTable*, int, long*) 9# doris::FlushToken::_flush_memtable(std::unique_ptr >, int, long) 10# doris::MemtableFlushTask::run() 11# doris::ThreadPool::dispatch_thread() 12# doris::Thread::supervise_thread(void*) 13# ? 14# clone ``` ``` I20240828 11:41:58.613629 20183 mem_tracker_limiter.cpp:182] [Address Sanitizer] free memory buf size inaccurate, mem tracker label: Load#Id=433657e8b3834e94-ac178bb7ab8ff661, consumption: 3239536, peak consumption: 6385184, buf: 0x6030015390a0, size: 32, old buf: 0x6030015390a0, old size: 20, new stack_trace: 0# doris::OwnedSlice::~OwnedSlice() 1# doris::segment_v2::IndexedColumnWriter::_finish_current_data_page(unsigned long&) 2# doris::segment_v2::IndexedColumnWriter::finish(doris::segment_v2::IndexedColumnMetaPB*) 3# doris::PrimaryKeyIndexBuilder::finalize(doris::segment_v2::PrimaryKeyIndexMetaPB*) 4# doris::segment_v2::VerticalSegmentWriter::_write_primary_key_index() 5# doris::segment_v2::VerticalSegmentWriter::finalize_columns_index(unsigned long*) 6# doris::segment_v2::VerticalSegmentWriter::finalize(unsigned long*, unsigned long*) 7# doris::SegmentFlusher::_flush_segment_writer(std::unique_ptr >&, std::shared_ptr, long*) 8# doris::SegmentFlusher::flush_single_block(doris::vectorized::Block const*, int, long*) 9# doris::SegmentCreator::flush_single_block(doris::vectorized::Block const*, int, long*) 10# doris::BetaRowsetWriterV2::flush_memtable(doris::vectorized::Block*, int, long*) 11# doris::FlushToken::_do_flush_memtable(doris::MemTable*, int, long*) 12# doris::FlushToken::_flush_memtable(std::unique_ptr >, int, long) 13# doris::MemtableFlushTask::run() 14# doris::ThreadPool::dispatch_thread() 15# doris::Thread::supervise_thread(void*) 16# ? 17# clone , old stack_trace: 0# Allocator::alloc_impl(unsigned long, unsigned long) 1# doris::faststring::build() 2# doris::segment_v2::BinaryPrefixPageBuilder::finish(doris::OwnedSlice*) 3# doris::segment_v2::IndexedColumnWriter::_finish_current_data_page(unsigned long&) 4# doris::segment_v2::IndexedColumnWriter::finish(doris::segment_v2::IndexedColumnMetaPB*) 5# doris::PrimaryKeyIndexBuilder::finalize(doris::segment_v2::PrimaryKeyIndexMetaPB*) 6# doris::segment_v2::VerticalSegmentWriter::_write_primary_key_index() 7# doris::segment_v2::VerticalSegmentWriter::finalize_columns_index(unsigned long*) 8# doris::segment_v2::VerticalSegmentWriter::finalize(unsigned long*, unsigned long*) 9# doris::SegmentFlusher::_flush_segment_writer(std::unique_ptr >&, std::shared_ptr, long*) 10# doris::SegmentFlusher::flush_single_block(doris::vectorized::Block const*, int, long*) 11# doris::SegmentCreator::flush_single_block(doris::vectorized::Block const*, int, long*) 12# doris::BetaRowsetWriterV2::flush_memtable(doris::vectorized::Block*, int, long*) 13# doris::FlushToken::_do_flush_memtable(doris::MemTable*, int, long*) 14# doris::FlushToken::_flush_memtable(std::unique_ptr >, int, long) 15# doris::MemtableFlushTask::run() 16# doris::ThreadPool::dispatch_thread() 17# doris::Thread::supervise_thread(void*) 18# ? 19# clon ``` --- be/src/util/faststring.h | 3 ++- be/src/util/slice.h | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/be/src/util/faststring.h b/be/src/util/faststring.h index 3ec0acbda01d79e..f82bcfdb0d9585e 100644 --- a/be/src/util/faststring.h +++ b/be/src/util/faststring.h @@ -85,7 +85,8 @@ class faststring : private Allocator(Allocator::alloc(len_)); + ret = reinterpret_cast(Allocator::alloc(capacity_)); + DCHECK(len_ <= capacity_); memcpy(ret, data_, len_); } OwnedSlice result(ret, len_, capacity_); diff --git a/be/src/util/slice.h b/be/src/util/slice.h index 1c8579ffed45d59..b38b1147894f9e5 100644 --- a/be/src/util/slice.h +++ b/be/src/util/slice.h @@ -362,7 +362,12 @@ class OwnedSlice : private Allocator