Skip to content

Commit 33e4c00

Browse files
authored
[fix](debug) Fix illegal access to runtime states (#56439)
### What problem does this PR solve? introduced by #56405 2 changes here: 1. print local runtime filter mgr info inside each task 2. make a pair for tasks with its corresponding runtime state. ==198869==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x7ba3927ac338 at pc 0x559d81e109b9 bp 0x7b7a5b8ad410 sp 0x7b7a5b8ad408 12:38:06  READ of size 8 at 0x7ba3927ac338 thread T1845 (EvHttpServer [w) 12:38:06  #0 0x559d81e109b8 in std::__uniq_ptr_impl<doris::RuntimeState, std::default_delete<doris::RuntimeState> >::_M_ptr() const /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/unique_ptr.h:193:51 12:38:06  #1 0x559d81e109b8 in std::unique_ptr<doris::RuntimeState, std::default_delete<doris::RuntimeState> >::get() const /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/unique_ptr.h:473:21 12:38:06  #2 0x559d81e109b8 in std::unique_ptr<doris::RuntimeState, std::default_delete<doris::RuntimeState> >::operator->() const /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/unique_ptr.h:466:9 12:38:06  #3 0x559d81e109b8 in doris::pipeline::PipelineFragmentContext::debug_string[abi:cxx11]() /root/doris/be/src/pipeline/pipeline_fragment_context.cpp:1941:28 12:38:06  #4 0x559d6d65aa2f in doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long)::$_0::operator()(phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&) const /root/doris/be/src/runtime/fragment_mgr.cpp:807:36 12:38:06  + echo 'cp -r /mnt/ssd01/pipline/OpenSourceDoris/clusterEnv/P0//Cluster0/fe/bin /home/work/pipline/backup_center/56368_04d746711764283b1cbafe40b1f849e10a5bcb6e_p0/fe/' 12:38:06  #5 0x559d6d65aa2f in doris::Status std::__invoke_impl<doris::Status, doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long)::$_0&, phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&>(std::__invoke_other, doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long)::$_0&, phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&) /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:63:14 12:38:06  + cp -r /mnt/ssd01/pipline/OpenSourceDoris/clusterEnv/P0//Cluster0/fe/conf /home/work/pipline/backup_center/56368_04d746711764283b1cbafe40b1f849e10a5bcb6e_p0/fe/ 12:38:06  #6 0x559d6d65aa2f in std::enable_if<is_invocable_r_v<doris::Status, doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long)::$_0&, phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&>, doris::Status>::type std::__invoke_r<doris::Status, doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long)::$_0&, phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&>(doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long)::$_0&, phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&) /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:116:9 12:38:06  #7 0x559d6d65aa2f in std::_Function_handler<doris::Status (phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&), doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long)::$_0>::_M_invoke(std::_Any_data const&, phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&) /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:292:9 12:38:06  #8 0x559d6d665d37 in std::function<doris::Status (phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&)>::operator()(phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&) const /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:593:9 12:38:06  #9 0x559d6d665d37 in doris::ConcurrentContextMap<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, doris::pipeline::PipelineFragmentContext>::apply(std::function<doris::Status (phmap::flat_hash_map<std::pair<doris::TUniqueId, int>, std::shared_ptr<doris::pipeline::PipelineFragmentContext>, phmap::Hash<std::pair<doris::TUniqueId, int> >, phmap::EqualTo<std::pair<doris::TUniqueId, int> >, std::allocator<std::pair<std::pair<doris::TUniqueId, int> const, std::shared_ptr<doris::pipeline::PipelineFragmentContext> > > >&)>&&) /root/doris/be/src/runtime/fragment_mgr.h:94:31 12:38:06  #10 0x559d6d647f93 in doris::FragmentMgr::dump_pipeline_tasks[abi:cxx11](long) /root/doris/be/src/runtime/fragment_mgr.cpp:792:23 12:38:06  #11 0x559d7068942b in doris::LongPipelineTaskAction::handle(doris::HttpRequest*) /root/doris/be/src/http/action/pipeline_task_action.cpp:54:69 12:38:06  #12 0x559d82c776c6 (/mnt/ssd01/pipline/OpenSourceDoris/clusterEnv/P0/Cluster0/be/lib/doris_be+0x385416c6) 12:38:06  #13 0x559d82c5775f in bufferevent_run_readcb_ /home/runner/work/doris-thirdparty/doris-thirdparty/thirdparty/src/libevent-release-2.1.12-stable/bufferevent.c:251:3 12:38:06  #14 0x559d82c79802 in bufferevent_trigger_nolock_ /home/runner/work/doris-thirdparty/doris-thirdparty/thirdparty/src/libevent-release-2.1.12-stable/bufferevent-internal.h:411:3 12:38:06  #15 0x559d82c79802 in bufferevent_readcb /home/runner/work/doris-thirdparty/doris-thirdparty/thirdparty/src/libevent-release-2.1.12-stable/bufferevent_sock.c:214:2 12:38:06  #16 0x559d82c60724 in event_persist_closure /home/runner/work/doris-thirdparty/doris-thirdparty/thirdparty/src/libevent-release-2.1.12-stable/event.c:1623:9 12:38:06  #17 0x559d82c60724 in event_process_active_single_queue /home/runner/work/doris-thirdparty/doris-thirdparty/thirdparty/src/libevent-release-2.1.12-stable/event.c:1682:4 12:38:06  #18 0x559d82c60d76 in event_process_active /home/runner/work/doris-thirdparty/doris-thirdparty/thirdparty/src/libevent-release-2.1.12-stable/event.c:1783:9 12:38:06  + echo 'cp -r /mnt/ssd01/pipline/OpenSourceDoris/clusterEnv/P0//Cluster0/fe/log /home/work/pipline/backup_center/56368_04d746711764283b1cbafe40b1f849e10a5bcb6e_p0/fe/' 12:38:06  #19 0x559d82c6355f in event_base_loop.constprop.0 /home/runner/work/doris-thirdparty/doris-thirdparty/thirdparty/src/libevent-release-2.1.12-stable/event.c:2006:12 12:38:06  #20 0x559d7072b08c in doris::EvHttpServer::start()::$_0::operator()() const /root/doris/be/src/http/ev_http_server.cpp:139:13 12:38:06  + cp -r /mnt/ssd01/pipline/OpenSourceDoris/clusterEnv/P0//Cluster0/fe/log /home/work/pipline/backup_center/56368_04d746711764283b1cbafe40b1f849e10a5bcb6e_p0/fe/ 12:38:06  #21 0x559d7072b08c in void std::__invoke_impl<void, doris::EvHttpServer::start()::$_0&>(std::__invoke_other, doris::EvHttpServer::start()::$_0&) /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:63:14 12:38:06  #22 0x559d7072b08c in std::enable_if<is_invocable_r_v<void, doris::EvHttpServer::start()::$_0&>, void>::type std::__invoke_r<void, doris::EvHttpServer::start()::$_0&>(doris::EvHttpServer::start()::$_0&) /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/invoke.h:113:2 12:38:06  #23 0x559d7072b08c in std::_Function_handler<void (), doris::EvHttpServer::start()::$_0>::_M_invoke(std::_Any_data const&) /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:292:9 12:38:06  #24 0x559d6e121772 in doris::ThreadPool::dispatch_thread() /root/doris/be/src/util/threadpool.cpp:614:24 12:38:06  #25 0x559d6e0fe7e6 in std::function<void ()>::operator()() const /usr/local/ldb-toolchain-v0.26/bin/../lib/gcc/x86_64-pc-linux-gnu/15/include/g++-v15/bits/std_function.h:593:9 12:38:06  #26 0x559d6e0fe7e6 in doris::Thread::supervise_thread(void*) /root/doris/be/src/util/thread.cpp:460:5 12:38:06  #27 0x559d6984ed26 in asan_thread_start(void*) (/mnt/ssd01/pipline/OpenSourceDoris/clusterEnv/P0/Cluster0/be/lib/doris_be+0x1f118d26) 12:38:06  #28 0x7f83909ee608 in start_thread /build/glibc-SzIz7B/glibc-2.31/nptl/pthread_create.c:477:8 12:38:06  #29 0x7f8390901132 in __clone /build/glibc-SzIz7B/glibc-2.31/misc/../sysdeps/unix/sysv/linux/x86_64/clone.S:95 ### Check List (For Author) - Test <!-- At least one of them must be included. --> - [ ] Regression test - [ ] Unit Test - [ ] Manual test (add detailed scripts or steps below) - [ ] No need to test or manual test. Explain why: - [ ] This is a refactor/code format and no logic has been changed. - [ ] Previous test can cover this change. - [ ] No code files have been changed. - [ ] Other reason <!-- Add your reason? --> - Behavior changed: - [ ] No. - [ ] Yes. <!-- Explain the behavior change --> - Does this need documentation? - [ ] No. - [ ] Yes. <!-- Add document PR link here. eg: apache/doris-website#1214 --> ### Check List (For Reviewer who merge this PR) - [ ] Confirm the release note - [ ] Confirm test cases - [ ] Confirm document - [ ] Add branch pick label <!-- Add branch pick label that this PR should merge into -->
1 parent af4db72 commit 33e4c00

File tree

3 files changed

+56
-67
lines changed

3 files changed

+56
-67
lines changed

be/src/pipeline/pipeline_fragment_context.cpp

Lines changed: 29 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,7 @@ PipelineFragmentContext::~PipelineFragmentContext() {
144144
auto st = _query_ctx->exec_status();
145145
for (size_t i = 0; i < _tasks.size(); i++) {
146146
if (!_tasks[i].empty()) {
147-
_call_back(_tasks[i].front()->runtime_state(), &st);
148-
}
149-
}
150-
for (auto& runtime_states : _task_runtime_states) {
151-
for (auto& runtime_state : runtime_states) {
152-
runtime_state.reset();
147+
_call_back(_tasks[i].front().first->runtime_state(), &st);
153148
}
154149
}
155150
_tasks.clear();
@@ -234,7 +229,7 @@ void PipelineFragmentContext::cancel(const Status reason) {
234229

235230
for (auto& tasks : _tasks) {
236231
for (auto& task : tasks) {
237-
task->terminate();
232+
task.first->terminate();
238233
}
239234
}
240235
}
@@ -379,9 +374,7 @@ Status PipelineFragmentContext::_build_pipeline_tasks(ThreadPool* thread_pool) {
379374
const auto target_size = _params.local_params.size();
380375
_tasks.resize(target_size);
381376
_runtime_filter_mgr_map.resize(target_size);
382-
_task_runtime_states.resize(_pipelines.size());
383377
for (size_t pip_idx = 0; pip_idx < _pipelines.size(); pip_idx++) {
384-
_task_runtime_states[pip_idx].resize(_pipelines[pip_idx]->num_tasks());
385378
_pip_id_to_pipeline[_pipelines[pip_idx]->id()] = _pipelines[pip_idx].get();
386379
}
387380
auto pipeline_id_to_profile = _runtime_state->build_pipeline_profile(_pipelines.size());
@@ -416,14 +409,10 @@ Status PipelineFragmentContext::_build_pipeline_tasks(ThreadPool* thread_pool) {
416409
for (size_t pip_idx = 0; pip_idx < _pipelines.size(); pip_idx++) {
417410
auto& pipeline = _pipelines[pip_idx];
418411
if (pipeline->num_tasks() > 1 || i == 0) {
419-
DCHECK(_task_runtime_states[pip_idx][i] == nullptr)
420-
<< print_id(_task_runtime_states[pip_idx][i]->fragment_instance_id()) << " "
421-
<< pipeline->debug_string();
422-
_task_runtime_states[pip_idx][i] = RuntimeState::create_unique(
412+
auto task_runtime_state = RuntimeState::create_unique(
423413
local_params.fragment_instance_id, _params.query_id, _params.fragment_id,
424414
_params.query_options, _query_ctx->query_globals, _exec_env,
425415
_query_ctx.get());
426-
auto& task_runtime_state = _task_runtime_states[pip_idx][i];
427416
{
428417
// Initialize runtime state for this task
429418
task_runtime_state->set_query_mem_tracker(_query_ctx->query_mem_tracker());
@@ -470,7 +459,9 @@ Status PipelineFragmentContext::_build_pipeline_tasks(ThreadPool* thread_pool) {
470459
pipeline_id_to_profile[pip_idx].get(), get_shared_state(pipeline), i);
471460
pipeline->incr_created_tasks(i, task.get());
472461
pipeline_id_to_task.insert({pipeline->id(), task.get()});
473-
_tasks[i].emplace_back(std::move(task));
462+
_tasks[i].emplace_back(
463+
std::pair<std::shared_ptr<PipelineTask>, std::unique_ptr<RuntimeState>> {
464+
std::move(task), std::move(task_runtime_state)});
474465
}
475466
}
476467

@@ -1703,7 +1694,7 @@ Status PipelineFragmentContext::submit() {
17031694
auto* scheduler = _query_ctx->get_pipe_exec_scheduler();
17041695
for (auto& task : _tasks) {
17051696
for (auto& t : task) {
1706-
st = scheduler->submit(t);
1697+
st = scheduler->submit(t.first);
17071698
DBUG_EXECUTE_IF("PipelineFragmentContext.submit.failed",
17081699
{ st = Status::Aborted("PipelineFragmentContext.submit.failed"); });
17091700
if (!st) {
@@ -1810,12 +1801,9 @@ std::string PipelineFragmentContext::get_load_error_url() {
18101801
if (const auto& str = _runtime_state->get_error_log_file_path(); !str.empty()) {
18111802
return to_load_error_http_path(str);
18121803
}
1813-
for (auto& task_states : _task_runtime_states) {
1814-
for (auto& task_state : task_states) {
1815-
if (!task_state) {
1816-
continue;
1817-
}
1818-
if (const auto& str = task_state->get_error_log_file_path(); !str.empty()) {
1804+
for (auto& tasks : _tasks) {
1805+
for (auto& task : tasks) {
1806+
if (const auto& str = task.second->get_error_log_file_path(); !str.empty()) {
18191807
return to_load_error_http_path(str);
18201808
}
18211809
}
@@ -1827,12 +1815,9 @@ std::string PipelineFragmentContext::get_first_error_msg() {
18271815
if (const auto& str = _runtime_state->get_first_error_msg(); !str.empty()) {
18281816
return str;
18291817
}
1830-
for (auto& task_states : _task_runtime_states) {
1831-
for (auto& task_state : task_states) {
1832-
if (!task_state) {
1833-
continue;
1834-
}
1835-
if (const auto& str = task_state->get_first_error_msg(); !str.empty()) {
1818+
for (auto& tasks : _tasks) {
1819+
for (auto& task : tasks) {
1820+
if (const auto& str = task.second->get_first_error_msg(); !str.empty()) {
18361821
return str;
18371822
}
18381823
}
@@ -1862,11 +1847,9 @@ Status PipelineFragmentContext::send_report(bool done) {
18621847

18631848
std::vector<RuntimeState*> runtime_states;
18641849

1865-
for (auto& task_states : _task_runtime_states) {
1866-
for (auto& task_state : task_states) {
1867-
if (task_state) {
1868-
runtime_states.push_back(task_state.get());
1869-
}
1850+
for (auto& tasks : _tasks) {
1851+
for (auto& task : tasks) {
1852+
runtime_states.push_back(task.second.get());
18701853
}
18711854
}
18721855

@@ -1900,15 +1883,15 @@ size_t PipelineFragmentContext::get_revocable_size(bool* has_running_task) const
19001883
// here to traverse the vector.
19011884
for (const auto& task_instances : _tasks) {
19021885
for (const auto& task : task_instances) {
1903-
if (task->is_running()) {
1886+
if (task.first->is_running()) {
19041887
LOG_EVERY_N(INFO, 50) << "Query: " << print_id(_query_id)
1905-
<< " is running, task: " << (void*)task.get()
1906-
<< ", is_running: " << task->is_running();
1888+
<< " is running, task: " << (void*)task.first.get()
1889+
<< ", is_running: " << task.first->is_running();
19071890
*has_running_task = true;
19081891
return 0;
19091892
}
19101893

1911-
size_t revocable_size = task->get_revocable_size();
1894+
size_t revocable_size = task.first->get_revocable_size();
19121895
if (revocable_size >= vectorized::SpillStream::MIN_SPILL_WRITE_BATCH_MEM) {
19131896
res += revocable_size;
19141897
}
@@ -1921,9 +1904,9 @@ std::vector<PipelineTask*> PipelineFragmentContext::get_revocable_tasks() const
19211904
std::vector<PipelineTask*> revocable_tasks;
19221905
for (const auto& task_instances : _tasks) {
19231906
for (const auto& task : task_instances) {
1924-
size_t revocable_size_ = task->get_revocable_size();
1907+
size_t revocable_size_ = task.first->get_revocable_size();
19251908
if (revocable_size_ >= vectorized::SpillStream::MIN_SPILL_WRITE_BATCH_MEM) {
1926-
revocable_tasks.emplace_back(task.get());
1909+
revocable_tasks.emplace_back(task.first.get());
19271910
}
19281911
}
19291912
}
@@ -1936,9 +1919,8 @@ std::string PipelineFragmentContext::debug_string() {
19361919
for (size_t j = 0; j < _tasks.size(); j++) {
19371920
fmt::format_to(debug_string_buffer, "Tasks in instance {}:\n", j);
19381921
for (size_t i = 0; i < _tasks[j].size(); i++) {
1939-
fmt::format_to(debug_string_buffer, "Task {}: {}\n{}\n", i,
1940-
_tasks[j][i]->debug_string(),
1941-
_task_runtime_states[i][j]->local_runtime_filter_mgr()->debug_string());
1922+
fmt::format_to(debug_string_buffer, "Task {}: {}\n", i,
1923+
_tasks[j][i].first->debug_string());
19421924
}
19431925
}
19441926

@@ -1988,16 +1970,16 @@ PipelineFragmentContext::collect_realtime_load_channel_profile() const {
19881970
return nullptr;
19891971
}
19901972

1991-
for (const auto& runtime_states : _task_runtime_states) {
1992-
for (const auto& runtime_state : runtime_states) {
1993-
if (runtime_state == nullptr || runtime_state->runtime_profile() == nullptr) {
1973+
for (const auto& tasks : _tasks) {
1974+
for (const auto& task : tasks) {
1975+
if (task.second->runtime_profile() == nullptr) {
19941976
continue;
19951977
}
19961978

19971979
auto tmp_load_channel_profile = std::make_shared<TRuntimeProfileTree>();
19981980

1999-
runtime_state->runtime_profile()->to_thrift(tmp_load_channel_profile.get(),
2000-
_runtime_state->profile_level());
1981+
task.second->runtime_profile()->to_thrift(tmp_load_channel_profile.get(),
1982+
_runtime_state->profile_level());
20011983
_runtime_state->load_channel_profile()->update(*tmp_load_channel_profile);
20021984
}
20031985
}

be/src/pipeline/pipeline_fragment_context.h

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ class PipelineFragmentContext : public TaskExecutionContext {
117117
void clear_finished_tasks() {
118118
for (size_t j = 0; j < _tasks.size(); j++) {
119119
for (size_t i = 0; i < _tasks[j].size(); i++) {
120-
_tasks[j][i]->stop_if_finished();
120+
_tasks[j][i].first->stop_if_finished();
121121
}
122122
}
123123
}
@@ -228,8 +228,25 @@ class PipelineFragmentContext : public TaskExecutionContext {
228228
bool _use_serial_source = false;
229229

230230
OperatorPtr _root_op = nullptr;
231-
// this is a [n * m] matrix. n is parallelism of pipeline engine and m is the number of pipelines.
232-
std::vector<std::vector<std::shared_ptr<PipelineTask>>> _tasks;
231+
//
232+
/**
233+
* Matrix stores tasks with local runtime states.
234+
* This is a [n * m] matrix. n is parallelism of pipeline engine and m is the number of pipelines.
235+
*
236+
* 2-D matrix:
237+
* +-------------------------+------------+-------+
238+
* | | Pipeline 0 | Pipeline 1 | ... |
239+
* +------------+------------+------------+-------+
240+
* | Instance 0 | task 0-0 | task 0-1 | ... |
241+
* +------------+------------+------------+-------+
242+
* | Instance 1 | task 1-0 | task 1-1 | ... |
243+
* +------------+------------+------------+-------+
244+
* | ... |
245+
* +--------------------------------------+-------+
246+
*/
247+
std::vector<
248+
std::vector<std::pair<std::shared_ptr<PipelineTask>, std::unique_ptr<RuntimeState>>>>
249+
_tasks;
233250

234251
// TODO: remove the _sink and _multi_cast_stream_sink_senders to set both
235252
// of it in pipeline task not the fragment_context
@@ -299,21 +316,6 @@ class PipelineFragmentContext : public TaskExecutionContext {
299316
// - _task_runtime_states is at the task level, unique to each task.
300317

301318
std::vector<TUniqueId> _fragment_instance_ids;
302-
/**
303-
* Local runtime states for each task.
304-
*
305-
* 2-D matrix:
306-
* +-------------------------+------------+-------+
307-
* | | Instance 0 | Instance 1 | ... |
308-
* +------------+------------+------------+-------+
309-
* | Pipeline 0 | task 0-0 | task 0-1 | ... |
310-
* +------------+------------+------------+-------+
311-
* | Pipeline 1 | task 1-0 | task 1-1 | ... |
312-
* +------------+------------+------------+-------+
313-
* | ... |
314-
* +--------------------------------------+-------+
315-
*/
316-
std::vector<std::vector<std::unique_ptr<RuntimeState>>> _task_runtime_states;
317319

318320
// Total instance num running on all BEs
319321
int _total_instances = -1;

be/src/pipeline/pipeline_task.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -735,10 +735,15 @@ std::string PipelineTask::debug_string() {
735735
return fmt::to_string(debug_string_buffer);
736736
}
737737
auto elapsed = fragment->elapsed_time() / NANOS_PER_SEC;
738-
fmt::format_to(debug_string_buffer,
739-
" elapse time = {}s, block dependency = [{}]\noperators: ", elapsed,
738+
fmt::format_to(debug_string_buffer, " elapse time = {}s, block dependency = [{}]\n", elapsed,
740739
cur_blocked_dep && !is_finalized() ? cur_blocked_dep->debug_string() : "NULL");
741740

741+
if (_state && _state->local_runtime_filter_mgr()) {
742+
fmt::format_to(debug_string_buffer, "local_runtime_filter_mgr: [{}]\n",
743+
_state->local_runtime_filter_mgr()->debug_string());
744+
}
745+
746+
fmt::format_to(debug_string_buffer, "operators: ");
742747
for (size_t i = 0; i < _operators.size(); i++) {
743748
fmt::format_to(debug_string_buffer, "\n{}",
744749
_opened && !is_finalized()

0 commit comments

Comments
 (0)