This is an automated email from the ASF dual-hosted git repository. yiguolei 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 4190f7354c [Bug][Memtable] fix core dump on int128 because not aligned by 16 byte (#10775) 4190f7354c is described below commit 4190f7354cccdee408e8e258448ee37aadf652e3 Author: Pxl <952130...@qq.com> AuthorDate: Wed Jul 13 08:30:58 2022 +0800 [Bug][Memtable] fix core dump on int128 because not aligned by 16 byte (#10775) * fix core dump on int128 because not aligned by 16 byte * update --- be/src/olap/memtable.cpp | 2 +- be/src/olap/memtable.h | 2 +- be/src/runtime/mem_pool.h | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/be/src/olap/memtable.cpp b/be/src/olap/memtable.cpp index b01cf3fcff..61035f13db 100644 --- a/be/src/olap/memtable.cpp +++ b/be/src/olap/memtable.cpp @@ -179,7 +179,7 @@ void MemTable::_insert_one_row_from_block(RowInBlock* row_in_block) { _aggregate_two_row_in_block(row_in_block, _vec_hint.curr->key); } else { row_in_block->init_agg_places( - (char*)_table_mem_pool->allocate(_total_size_of_aggregate_states), + (char*)_table_mem_pool->allocate_aligned(_total_size_of_aggregate_states, 16), _offsets_of_aggregate_states.data()); for (auto cid = _schema->num_key_columns(); cid < _schema->num_columns(); cid++) { auto col_ptr = _input_mutable_block.mutable_columns()[cid].get(); diff --git a/be/src/olap/memtable.h b/be/src/olap/memtable.h index 0ff15789cc..3fbfe8288e 100644 --- a/be/src/olap/memtable.h +++ b/be/src/olap/memtable.h @@ -91,7 +91,7 @@ private: _agg_state_offset = agg_state_offset; } - char* agg_places(size_t offset) { return _agg_mem + _agg_state_offset[offset]; } + char* agg_places(size_t offset) const { return _agg_mem + _agg_state_offset[offset]; } }; class RowInBlockComparator { diff --git a/be/src/runtime/mem_pool.h b/be/src/runtime/mem_pool.h index 769e5d67ae..02842b9752 100644 --- a/be/src/runtime/mem_pool.h +++ b/be/src/runtime/mem_pool.h @@ -104,9 +104,17 @@ public: /// of the current chunk. Creates a new chunk if there aren't any chunks /// with enough capacity. uint8_t* allocate(int64_t size, Status* rst = nullptr) { + // TODO: rethink if DEFAULT_ALIGNMENT should be changed, malloc is aligned by 16. return allocate<false>(size, DEFAULT_ALIGNMENT, rst); } + uint8_t* allocate_aligned(int64_t size, int alignment, Status* rst = nullptr) { + DCHECK_GE(alignment, 1); + DCHECK_LE(alignment, config::memory_max_alignment); + DCHECK_EQ(BitUtil::RoundUpToPowerOfTwo(alignment), alignment); + return allocate<false>(size, alignment, rst); + } + /// Same as Allocate() expect add a check when return a nullptr Status allocate_safely(int64_t size, uint8_t*& ret, Status* rst = nullptr) { return allocate_safely<false>(size, DEFAULT_ALIGNMENT, ret, rst); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org