[branch-2.1](memory) When Load ends, check memory tracker value returns is equal to 0#40850
Conversation
… exception safe (apache#38960) At present, the memory allocation of `ByteBuffer` is done through `new char[capacity_]`. Now, it is uniformly allocated by `Allocator` for the following purposes: 1. Better memory statistics 2. Better support for memory limit check
…r TLS attach task ends (apache#39908) Allocator save TLS MemTracker during first alloc, which is used to release memory after TLS attach task ends. ``` 23:00:15 F20240824 22:56:49.773799 66432 thread_context.h:238] Check failed: doris::k_doris_exit || !doris::config::enable_memory_orphan_check || thread_mem_tracker()->label() != "Orphan" If you crash here, it means that SCOPED_ATTACH_TASK and SCOPED_SWITCH_THREAD_MEM_TRACKER_LIMITER are not used correctly. starting position of each thread is expected to use SCOPED_ATTACH_TASK to bind a MemTrackerLimiter belonging to Query/Load/Compaction/Other Tasks, otherwise memory alloc using Doris Allocator in the thread will crash. If you want to switch MemTrackerLimiter during thread execution, please use SCOPED_SWITCH_THREAD_MEM_TRACKER_LIMITER, do not repeat Attach. Of course, you can modify enable_memory_orphan_check=false in be.conf to avoid this crash. 23:00:15 *** Check failure stack trace: *** 23:00:15 @ 0x55645d3388e6 google::LogMessageFatal::~LogMessageFatal() 23:00:15 @ 0x5564439637c2 doris::ThreadContext::consume_memory() 23:00:15 @ 0x5564439914fe Allocator<>::release_memory() 23:00:15 @ 0x5564354be11e std::_Sp_counted_ptr<>::_M_dispose() 23:00:15 @ 0x55643557bc3b std::deque<>::pop_front() 23:00:15 @ 0x5564355756b1 doris::io::StreamLoadPipe::~StreamLoadPipe() 23:00:15 @ 0x5564354bfa77 doris::StreamLoadContext::~StreamLoadContext() 23:00:15 @ 0x556436ee5114 doris::HttpRequest::~HttpRequest() ```
```
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::segment_v2::VerticalSegmentWriter, std::default_delete<doris::segment_v2::VerticalSegmentWriter> >&, 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<doris::MemTable, std::default_delete<doris::MemTable> >, 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<doris::segment_v2::VerticalSegmentWriter, std::default_delete<doris::segment_v2::VerticalSegmentWriter> >&, std::shared_ptr<doris::TabletSchema>, 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<doris::MemTable, std::default_delete<doris::MemTable> >, 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<false, false, false, DefaultMemoryAllocator>::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<doris::segment_v2::VerticalSegmentWriter, std::default_delete<doris::segment_v2::VerticalSegmentWriter> >&, std::shared_ptr<doris::TabletSchema>, 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<doris::MemTable, std::default_delete<doris::MemTable> >, int, long)
15# doris::MemtableFlushTask::run()
16# doris::ThreadPool::dispatch_thread()
17# doris::Thread::supervise_thread(void*)
18# ?
19# clon
```
…qual to 0 (apache#40016) Check all memory is freed when Load is finished.
fix: 
|
Thank you for your contribution to Apache Doris. Since 2024-03-18, the Document has been moved to doris-website. |
|
run buildall |
|
TeamCity be ut coverage result: |
|
run buildall |
|
TeamCity be ut coverage result: |
pick
#38960
#39908
#40043
#40092
#40016
#40439