This is an automated email from the ASF dual-hosted git repository.
liaoxin 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 d4d5ad03243 [enhancement](merge-iterator) catch exception to avoid
coredump when copy_rows (#33567)
d4d5ad03243 is described below
commit d4d5ad032436be2a8fda6ebd494ea547ed04366c
Author: Xin Liao <[email protected]>
AuthorDate: Fri Apr 12 20:03:18 2024 +0800
[enhancement](merge-iterator) catch exception to avoid coredump when
copy_rows (#33567)
---
be/src/vec/olap/vgeneric_iterators.cpp | 34 ++++++++++++++++++++--------------
be/src/vec/olap/vgeneric_iterators.h | 10 +++++-----
2 files changed, 25 insertions(+), 19 deletions(-)
diff --git a/be/src/vec/olap/vgeneric_iterators.cpp
b/be/src/vec/olap/vgeneric_iterators.cpp
index c973a7131f9..26fe590dd60 100644
--- a/be/src/vec/olap/vgeneric_iterators.cpp
+++ b/be/src/vec/olap/vgeneric_iterators.cpp
@@ -136,42 +136,48 @@ bool VMergeIteratorContext::compare(const
VMergeIteratorContext& rhs) const {
}
// `advanced = false` when current block finished
-void VMergeIteratorContext::copy_rows(Block* block, bool advanced) {
+Status VMergeIteratorContext::copy_rows(Block* block, bool advanced) {
Block& src = *_block;
Block& dst = *block;
if (_cur_batch_num == 0) {
- return;
+ return Status::OK();
}
// copy a row to dst block column by column
size_t start = _index_in_block - _cur_batch_num + 1 - advanced;
- for (size_t i = 0; i < _num_columns; ++i) {
- auto& s_col = src.get_by_position(i);
- auto& d_col = dst.get_by_position(i);
+ RETURN_IF_CATCH_EXCEPTION({
+ for (size_t i = 0; i < _num_columns; ++i) {
+ auto& s_col = src.get_by_position(i);
+ auto& d_col = dst.get_by_position(i);
- ColumnPtr& s_cp = s_col.column;
- ColumnPtr& d_cp = d_col.column;
+ ColumnPtr& s_cp = s_col.column;
+ ColumnPtr& d_cp = d_col.column;
- d_cp->assume_mutable()->insert_range_from(*s_cp, start,
_cur_batch_num);
- }
+ d_cp->assume_mutable()->insert_range_from(*s_cp, start,
_cur_batch_num);
+ }
+ });
const auto& tmp_pre_ctx_same_bit = get_pre_ctx_same();
dst.set_same_bit(tmp_pre_ctx_same_bit.begin(),
tmp_pre_ctx_same_bit.begin() + _cur_batch_num);
_cur_batch_num = 0;
+ return Status::OK();
}
-void VMergeIteratorContext::copy_rows(BlockView* view, bool advanced) {
+Status VMergeIteratorContext::copy_rows(BlockView* view, bool advanced) {
if (_cur_batch_num == 0) {
- return;
+ return Status::OK();
}
size_t start = _index_in_block - _cur_batch_num + 1 - advanced;
const auto& tmp_pre_ctx_same_bit = get_pre_ctx_same();
- for (size_t i = 0; i < _cur_batch_num; ++i) {
- view->push_back({_block, static_cast<int>(start + i),
tmp_pre_ctx_same_bit[i]});
- }
+ RETURN_IF_CATCH_EXCEPTION({
+ for (size_t i = 0; i < _cur_batch_num; ++i) {
+ view->push_back({_block, static_cast<int>(start + i),
tmp_pre_ctx_same_bit[i]});
+ }
+ });
_cur_batch_num = 0;
+ return Status::OK();
}
// This iterator will generate ordered data. For example for schema
diff --git a/be/src/vec/olap/vgeneric_iterators.h
b/be/src/vec/olap/vgeneric_iterators.h
index f2e5e04bcc5..d67bb68fefa 100644
--- a/be/src/vec/olap/vgeneric_iterators.h
+++ b/be/src/vec/olap/vgeneric_iterators.h
@@ -108,9 +108,9 @@ public:
bool compare(const VMergeIteratorContext& rhs) const;
// `advanced = false` when current block finished
- void copy_rows(Block* block, bool advanced = true);
+ Status copy_rows(Block* block, bool advanced = true);
- void copy_rows(BlockView* view, bool advanced = true);
+ Status copy_rows(BlockView* view, bool advanced = true);
RowLocation current_row_location() {
DCHECK(_record_rowids);
@@ -245,7 +245,7 @@ private:
ctx->add_cur_batch();
if (pre_ctx != ctx) {
if (pre_ctx) {
- pre_ctx->copy_rows(block);
+ RETURN_IF_ERROR(pre_ctx->copy_rows(block));
}
pre_ctx = ctx;
}
@@ -257,14 +257,14 @@ private:
if (ctx->is_cur_block_finished() || row_idx >= _block_row_max)
{
// current block finished, ctx not advance
// so copy start_idx = (_index_in_block - _cur_batch_num +
1)
- ctx->copy_rows(block, false);
+ RETURN_IF_ERROR(ctx->copy_rows(block, false));
pre_ctx = nullptr;
}
} else if (_merged_rows != nullptr) {
(*_merged_rows)++;
// need skip cur row, so flush rows in pre_ctx
if (pre_ctx) {
- pre_ctx->copy_rows(block);
+ RETURN_IF_ERROR(pre_ctx->copy_rows(block));
pre_ctx = nullptr;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]