Coverage Report

Created: 2025-04-14 13:20

/root/doris/be/src/runtime/thread_context.cpp
Line
Count
Source (jump to first uncovered line)
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
2
void AttachTask::init(const std::shared_ptr<ResourceContext>& rc) {
28
2
    ThreadLocalHandle::create_thread_local_if_not_exits();
29
2
    signal::set_signal_task_id(rc->task_controller()->task_id());
30
2
    thread_context()->attach_task(rc);
31
2
}
32
33
2
AttachTask::AttachTask(const std::shared_ptr<ResourceContext>& rc) {
34
2
    init(rc);
35
2
}
36
37
0
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
0
    std::shared_ptr<ResourceContext> rc = ResourceContext::create_shared();
42
0
    rc->memory_context()->set_mem_tracker(mem_tracker);
43
0
    init(rc);
44
0
}
45
46
0
AttachTask::AttachTask(RuntimeState* runtime_state) {
47
0
    signal::set_signal_is_nereids(runtime_state->is_nereids());
48
0
    init(runtime_state->get_query_ctx()->resource_ctx());
49
0
}
50
51
0
AttachTask::AttachTask(QueryContext* query_ctx) {
52
0
    init(query_ctx->resource_ctx());
53
0
}
54
55
2
AttachTask::~AttachTask() {
56
2
    signal::set_signal_task_id(TUniqueId());
57
2
    thread_context()->detach_task();
58
2
    ThreadLocalHandle::del_thread_local_if_count_is_zero();
59
2
}
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
    if (thread_context()->is_attach_task()) {
65
4
        old_resource_ctx_ = thread_context()->resource_ctx();
66
4
        if (rc != old_resource_ctx_) {
67
3
            signal::set_signal_task_id(rc->task_controller()->task_id());
68
3
            thread_context()->resource_ctx_ = rc;
69
3
            thread_context()->thread_mem_tracker_mgr->attach_limiter_tracker(
70
3
                    rc->memory_context()->mem_tracker(), rc->workload_group());
71
3
        }
72
4
    } else {
73
1
        signal::set_signal_task_id(rc->task_controller()->task_id());
74
1
        thread_context()->attach_task(rc);
75
1
    }
76
5
}
77
78
5
SwitchResourceContext::~SwitchResourceContext() {
79
5
    if (old_resource_ctx_ != thread_context()->resource_ctx()) {
80
4
        if (old_resource_ctx_ != nullptr) {
81
3
            signal::set_signal_task_id(old_resource_ctx_->task_controller()->task_id());
82
3
            thread_context()->resource_ctx_ = old_resource_ctx_;
83
3
            thread_context()->thread_mem_tracker_mgr->detach_limiter_tracker();
84
3
        } else {
85
1
            signal::set_signal_task_id(TUniqueId());
86
1
            thread_context()->detach_task();
87
1
        }
88
4
    }
89
5
    doris::ThreadLocalHandle::del_thread_local_if_count_is_zero();
90
5
}
91
92
SwitchThreadMemTrackerLimiter::SwitchThreadMemTrackerLimiter(
93
3
        const std::shared_ptr<doris::MemTrackerLimiter>& mem_tracker) {
94
3
    DCHECK(mem_tracker);
95
3
    doris::ThreadLocalHandle::create_thread_local_if_not_exits();
96
3
    if (mem_tracker != thread_context()->thread_mem_tracker_mgr->limiter_mem_tracker()) {
97
3
        thread_context()->thread_mem_tracker_mgr->attach_limiter_tracker(mem_tracker);
98
3
        is_switched_ = true;
99
3
    }
100
3
}
101
102
3
SwitchThreadMemTrackerLimiter::~SwitchThreadMemTrackerLimiter() {
103
3
    if (is_switched_) {
104
3
        thread_context()->thread_mem_tracker_mgr->detach_limiter_tracker();
105
3
    }
106
3
    doris::ThreadLocalHandle::del_thread_local_if_count_is_zero();
107
3
}
108
109
0
AddThreadMemTrackerConsumer::AddThreadMemTrackerConsumer(MemTracker* mem_tracker) {
110
0
    ThreadLocalHandle::create_thread_local_if_not_exits();
111
0
    if (mem_tracker) {
112
0
        _need_pop = thread_context()->thread_mem_tracker_mgr->push_consumer_tracker(mem_tracker);
113
0
    }
114
0
}
115
116
AddThreadMemTrackerConsumer::AddThreadMemTrackerConsumer(
117
        const std::shared_ptr<MemTracker>& mem_tracker)
118
3
        : _mem_tracker(mem_tracker) {
119
3
    ThreadLocalHandle::create_thread_local_if_not_exits();
120
3
    if (_mem_tracker) {
121
3
        _need_pop =
122
3
                thread_context()->thread_mem_tracker_mgr->push_consumer_tracker(_mem_tracker.get());
123
3
    }
124
3
}
125
126
3
AddThreadMemTrackerConsumer::~AddThreadMemTrackerConsumer() {
127
3
    if (_need_pop) {
128
2
        thread_context()->thread_mem_tracker_mgr->pop_consumer_tracker();
129
2
    }
130
3
    ThreadLocalHandle::del_thread_local_if_count_is_zero();
131
3
}
132
133
AddThreadMemTrackerConsumerByHook::AddThreadMemTrackerConsumerByHook(
134
        const std::shared_ptr<MemTracker>& mem_tracker)
135
0
        : _mem_tracker(mem_tracker) {
136
0
    ThreadLocalHandle::create_thread_local_if_not_exits();
137
0
    DCHECK(mem_tracker != nullptr);
138
0
    use_mem_hook = true;
139
0
    thread_context()->thread_mem_tracker_mgr->push_consumer_tracker(_mem_tracker.get());
140
0
}
141
142
0
AddThreadMemTrackerConsumerByHook::~AddThreadMemTrackerConsumerByHook() {
143
0
    thread_context()->thread_mem_tracker_mgr->pop_consumer_tracker();
144
0
    use_mem_hook = false;
145
0
    ThreadLocalHandle::del_thread_local_if_count_is_zero();
146
0
}
147
148
} // namespace doris