@@ -119,43 +119,11 @@ int64_t MemTableMemoryLimiter::_need_flush() {
119119 return need_flush - _queue_mem_usage - _flush_mem_usage;
120120}
121121
122- void MemTableMemoryLimiter::handle_workload_group_memtable_flush (
123- WorkloadGroupPtr wg, std::function<bool ()> cancel_check) {
124- // It means some query is pending on here to flush memtable and to continue running.
125- // So that should wait here.
126- // Wait at most 3s, because this code is not aware cancel flag. If the load task is cancelled
127- // Should releae memory quickly.
128- using namespace std ::chrono_literals;
129- int32_t max_sleep_times = 30 ;
130- int32_t sleep_times = max_sleep_times;
131- MonotonicStopWatch timer;
132- timer.start ();
133- while (wg != nullptr && wg->enable_write_buffer_limit () && wg->exceed_write_buffer_limit () &&
134- sleep_times > 0 ) {
135- if (cancel_check && cancel_check ()) {
136- LOG (INFO) << " cancelled when waiting for memtable flush, wg: "
137- << (wg == nullptr ? " null" : wg->debug_string ());
138- return ;
139- }
140- std::this_thread::sleep_for (100ms);
141- --sleep_times;
142- }
143- if (sleep_times < max_sleep_times) {
144- timer.stop ();
145- VLOG_DEBUG << " handle_workload_group_memtable_flush waited "
146- << PrettyPrinter::print (timer.elapsed_time (), TUnit::TIME_NS)
147- << " , wg: " << wg->debug_string ();
148- }
149- // Check process memory again.
150- _handle_memtable_flush (wg, cancel_check);
151- }
152-
153- void MemTableMemoryLimiter::_handle_memtable_flush (WorkloadGroupPtr wg,
154- std::function<bool ()> cancel_check) {
122+ void MemTableMemoryLimiter::handle_memtable_flush (std::function<bool ()> cancel_check) {
155123 // Check the soft limit.
156124 DCHECK (_load_soft_mem_limit > 0 );
157125 do {
158- DBUG_EXECUTE_IF (" MemTableMemoryLimiter._handle_memtable_flush .limit_reached" , {
126+ DBUG_EXECUTE_IF (" MemTableMemoryLimiter.handle_memtable_flush .limit_reached" , {
159127 LOG (INFO) << " debug memtable limit reached" ;
160128 break ;
161129 });
@@ -176,8 +144,7 @@ void MemTableMemoryLimiter::_handle_memtable_flush(WorkloadGroupPtr wg,
176144 }
177145 }
178146 if (cancel_check && cancel_check ()) {
179- LOG (INFO) << " cancelled when waiting for memtable flush, wg: "
180- << (wg == nullptr ? " null" : wg->debug_string ());
147+ LOG (INFO) << " cancelled when waiting for memtable flush" ;
181148 return ;
182149 }
183150 first = false ;
@@ -192,15 +159,14 @@ void MemTableMemoryLimiter::_handle_memtable_flush(WorkloadGroupPtr wg,
192159 << " , active: " << PrettyPrinter::print_bytes (_active_mem_usage)
193160 << " , queue: " << PrettyPrinter::print_bytes (_queue_mem_usage)
194161 << " , flush: " << PrettyPrinter::print_bytes (_flush_mem_usage)
195- << " , need flush: " << PrettyPrinter::print_bytes (need_flush)
196- << " , wg: " << (wg ? wg->debug_string () : " null" );
162+ << " , need flush: " << PrettyPrinter::print_bytes (need_flush);
197163 if (VLOG_DEBUG_IS_ON) {
198164 auto log_str = doris::ProcessProfile::instance ()
199165 ->memory_profile ()
200166 ->process_memory_detail_str ();
201167 LOG_LONG_STRING (INFO, log_str);
202168 }
203- _flush_active_memtables (0 , need_flush);
169+ _flush_active_memtables (need_flush);
204170 }
205171 } while (_hard_limit_reached () && !_load_usage_low ());
206172 g_memtable_memory_limit_waiting_threads << -1 ;
@@ -216,37 +182,11 @@ void MemTableMemoryLimiter::_handle_memtable_flush(WorkloadGroupPtr wg,
216182 << " , memtable writers num: " << _writers.size ()
217183 << " , active: " << PrettyPrinter::print_bytes (_active_mem_usage)
218184 << " , queue: " << PrettyPrinter::print_bytes (_queue_mem_usage)
219- << " , flush: " << PrettyPrinter::print_bytes (_flush_mem_usage)
220- << " , wg: " << (wg ? wg->debug_string () : " null." );
221- }
222- }
223-
224- int64_t MemTableMemoryLimiter::flush_workload_group_memtables (uint64_t wg_id, int64_t need_flush) {
225- std::unique_lock<std::mutex> l (_lock);
226- return _flush_active_memtables (wg_id, need_flush);
227- }
228-
229- void MemTableMemoryLimiter::get_workload_group_memtable_usage (uint64_t wg_id, int64_t * active_bytes,
230- int64_t * queue_bytes,
231- int64_t * flush_bytes) {
232- std::unique_lock<std::mutex> l (_lock);
233- *active_bytes = 0 ;
234- *queue_bytes = 0 ;
235- *flush_bytes = 0 ;
236- for (auto it = _writers.begin (); it != _writers.end (); ++it) {
237- if (auto writer = it->lock ()) {
238- // If wg id is specified, but wg id not match, then not need flush
239- if (writer->workload_group_id () != wg_id) {
240- continue ;
241- }
242- *active_bytes += writer->active_memtable_mem_consumption ();
243- *queue_bytes += writer->mem_consumption (MemType::WRITE_FINISHED);
244- *flush_bytes += writer->mem_consumption (MemType::FLUSH);
245- }
185+ << " , flush: " << PrettyPrinter::print_bytes (_flush_mem_usage);
246186 }
247187}
248188
249- int64_t MemTableMemoryLimiter::_flush_active_memtables (uint64_t wg_id, int64_t need_flush) {
189+ int64_t MemTableMemoryLimiter::_flush_active_memtables (int64_t need_flush) {
250190 if (need_flush <= 0 ) {
251191 return 0 ;
252192 }
@@ -278,10 +218,7 @@ int64_t MemTableMemoryLimiter::_flush_active_memtables(uint64_t wg_id, int64_t n
278218 if (w == nullptr ) {
279219 continue ;
280220 }
281- // If wg id is specified, but wg id not match, then not need flush
282- if (wg_id != 0 && w->workload_group_id () != wg_id) {
283- continue ;
284- }
221+
285222 int64_t mem = w->active_memtable_mem_consumption ();
286223 if (mem < sort_mem * 0.9 ) {
287224 // if the memtable writer just got flushed, don't flush it again
0 commit comments