Coverage Report

Created: 2026-03-12 17:07

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/runtime/thread_context.cpp
Line
Count
Source
1
// Licensed to the Apache Software Foundation (ASF) under one
2
// or more contributor license agreements.  See the NOTICE file
3
// distributed with this work for additional information
4
// regarding copyright ownership.  The ASF licenses this file
5
// to you under the Apache License, Version 2.0 (the
6
// "License"); you may not use this file except in compliance
7
// with the License.  You may obtain a copy of the License at
8
//
9
//   http://www.apache.org/licenses/LICENSE-2.0
10
//
11
// Unless required by applicable law or agreed to in writing,
12
// software distributed under the License is distributed on an
13
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
// KIND, either express or implied.  See the License for the
15
// specific language governing permissions and limitations
16
// under the License.
17
18
#include "runtime/thread_context.h"
19
20
#include "common/signal_handler.h"
21
#include "runtime/query_context.h"
22
#include "runtime/runtime_state.h"
23
24
namespace doris {
25
class MemTracker;
26
27
15.0M
void AttachTask::init(const std::shared_ptr<ResourceContext>& rc) {
28
15.0M
    ThreadLocalHandle::create_thread_local_if_not_exits();
29
15.0M
    signal::set_signal_task_id(rc->task_controller()->task_id());
30
15.0M
    thread_context()->attach_task(rc);
31
15.0M
}
32
33
790k
AttachTask::AttachTask(const std::shared_ptr<ResourceContext>& rc) {
34
790k
    init(rc);
35
790k
}
36
37
842k
AttachTask::AttachTask(const std::shared_ptr<MemTrackerLimiter>& mem_tracker) {
38
    // if parameter is `orphan_mem_tracker`, if you do not switch thraed mem tracker afterwards,
39
    // alloc or free memory from Allocator will fail DCHECK. unless you know for sure that
40
    // the thread will not alloc or free memory from Allocator later.
41
842k
    std::shared_ptr<ResourceContext> rc = ResourceContext::create_shared();
42
842k
    rc->memory_context()->set_mem_tracker(mem_tracker);
43
842k
    init(rc);
44
842k
}
45
46
13.0M
AttachTask::AttachTask(RuntimeState* runtime_state) {
47
13.0M
    signal::set_signal_is_nereids(runtime_state->is_nereids());
48
13.0M
    init(runtime_state->get_query_ctx()->resource_ctx());
49
13.0M
}
50
51
409k
AttachTask::AttachTask(QueryContext* query_ctx) {
52
409k
    init(query_ctx->resource_ctx());
53
409k
}
54
55
15.0M
AttachTask::~AttachTask() {
56
15.0M
    signal::set_signal_task_id(TUniqueId());
57
15.0M
    thread_context()->detach_task();
58
15.0M
    ThreadLocalHandle::del_thread_local_if_count_is_zero();
59
15.0M
}
60
61
5
SwitchResourceContext::SwitchResourceContext(const std::shared_ptr<ResourceContext>& rc) {
62
5
    DCHECK(rc != nullptr);
63
5
    doris::ThreadLocalHandle::create_thread_local_if_not_exits();
64
5
    DCHECK(thread_context()->is_attach_task());
65
5
    old_resource_ctx_ = thread_context()->resource_ctx();
66
5
    if (rc != old_resource_ctx_) {
67
4
        signal::set_signal_task_id(rc->task_controller()->task_id());
68
4
        thread_context()->resource_ctx_ = rc;
69
4
        thread_context()->thread_mem_tracker_mgr->attach_limiter_tracker(
70
4
                rc->memory_context()->mem_tracker(), rc->workload_group());
71
4
    }
72
5
}
73
74
5
SwitchResourceContext::~SwitchResourceContext() {
75
5
    if (old_resource_ctx_ != thread_context()->resource_ctx()) {
76
4
        DCHECK(old_resource_ctx_ != nullptr);
77
4
        signal::set_signal_task_id(old_resource_ctx_->task_controller()->task_id());
78
4
        thread_context()->resource_ctx_ = old_resource_ctx_;
79
4
        thread_context()->thread_mem_tracker_mgr->detach_limiter_tracker();
80
4
    }
81
5
    doris::ThreadLocalHandle::del_thread_local_if_count_is_zero();
82
5
}
83
84
SwitchThreadMemTrackerLimiter::SwitchThreadMemTrackerLimiter(
85
18.6M
        const std::shared_ptr<doris::MemTrackerLimiter>& mem_tracker) {
86
18.6M
    DCHECK(mem_tracker);
87
18.6M
    doris::ThreadLocalHandle::create_thread_local_if_not_exits();
88
18.6M
    if (mem_tracker != thread_context()->thread_mem_tracker_mgr->limiter_mem_tracker_sptr()) {
89
6.20M
        thread_context()->thread_mem_tracker_mgr->attach_limiter_tracker(mem_tracker);
90
6.20M
        is_switched_ = true;
91
6.20M
    }
92
18.6M
}
93
94
18.6M
SwitchThreadMemTrackerLimiter::~SwitchThreadMemTrackerLimiter() {
95
18.6M
    if (is_switched_) {
96
6.19M
        thread_context()->thread_mem_tracker_mgr->detach_limiter_tracker();
97
6.19M
    }
98
18.6M
    doris::ThreadLocalHandle::del_thread_local_if_count_is_zero();
99
18.6M
}
100
101
2.96M
AddThreadMemTrackerConsumer::AddThreadMemTrackerConsumer(MemTracker* mem_tracker) {
102
2.96M
    ThreadLocalHandle::create_thread_local_if_not_exits();
103
2.96M
    if (mem_tracker) {
104
2.96M
        _need_pop = thread_context()->thread_mem_tracker_mgr->push_consumer_tracker(mem_tracker);
105
2.96M
    }
106
2.96M
}
107
108
AddThreadMemTrackerConsumer::AddThreadMemTrackerConsumer(
109
        const std::shared_ptr<MemTracker>& mem_tracker)
110
424k
        : _mem_tracker(mem_tracker) {
111
424k
    ThreadLocalHandle::create_thread_local_if_not_exits();
112
424k
    if (_mem_tracker) {
113
423k
        _need_pop =
114
423k
                thread_context()->thread_mem_tracker_mgr->push_consumer_tracker(_mem_tracker.get());
115
423k
    }
116
424k
}
117
118
3.38M
AddThreadMemTrackerConsumer::~AddThreadMemTrackerConsumer() {
119
3.38M
    if (_need_pop) {
120
3.38M
        thread_context()->thread_mem_tracker_mgr->pop_consumer_tracker();
121
3.38M
    }
122
3.38M
    ThreadLocalHandle::del_thread_local_if_count_is_zero();
123
3.38M
}
124
125
} // namespace doris