Coverage Report

Created: 2026-07-07 17:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/cloud/cloud_tablet_hotspot.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 "cloud/cloud_tablet_hotspot.h"
19
20
#include <algorithm>
21
#include <chrono>
22
#include <cmath>
23
#include <cstdint>
24
#include <mutex>
25
#include <vector>
26
27
#include "runtime/memory/global_memory_arbitrator.h"
28
#include "storage/tablet/base_tablet.h"
29
30
namespace doris {
31
32
namespace {
33
34
using HotPartitionSnapshot =
35
        std::unordered_map<TabletHotspotMapKey, std::unordered_map<int64_t, TabletHotspotMapValue>,
36
                           MapKeyHash>;
37
38
constexpr uint64_t kCountHeartbeatInterval = 500000;
39
constexpr uint64_t kNewCounterLogInterval = 4096;
40
constexpr size_t kCompactBucketMultiplier = 4;
41
constexpr size_t kCompactEraseRatioDivisor = 4;
42
43
using SystemTimePoint = std::chrono::system_clock::time_point;
44
using SteadyClock = std::chrono::steady_clock;
45
46
8
double bytes_to_mb(int64_t bytes) {
47
8
    return static_cast<double>(bytes) / (1024.0 * 1024.0);
48
8
}
49
50
0
double ratio_or_zero(uint64_t numerator, uint64_t denominator) {
51
0
    if (denominator == 0) {
52
0
        return 0.0;
53
0
    }
54
0
    return static_cast<double>(numerator) / static_cast<double>(denominator);
55
0
}
56
57
8
int64_t process_memory_usage_for_diag() {
58
8
#ifdef BE_TEST
59
8
    return 0;
60
#else
61
    return GlobalMemoryArbitrator::process_memory_usage();
62
#endif
63
8
}
64
65
24
uint64_t count_hot_partition_entries(const HotPartitionSnapshot& snapshot) {
66
24
    uint64_t entries = 0;
67
24
    for (const auto& [_, partition_to_value] : snapshot) {
68
8
        entries += partition_to_value.size();
69
8
    }
70
24
    return entries;
71
24
}
72
73
bool should_compact_slot(size_t slot_size_before, size_t slot_size_after, size_t bucket_count_after,
74
10.2k
                         size_t erased_count) {
75
10.2k
    if (erased_count == 0) {
76
10.2k
        return false;
77
10.2k
    }
78
8
    if (slot_size_after == 0) {
79
8
        return true;
80
8
    }
81
0
    return bucket_count_after > (kCompactBucketMultiplier * slot_size_after) ||
82
0
           (slot_size_before > 0 && erased_count * kCompactEraseRatioDivisor >= slot_size_before);
83
8
}
84
85
} // namespace
86
87
0
void TabletHotspot::count(const BaseTablet& tablet) {
88
0
    count(tablet.tablet_id(), tablet.table_id(), tablet.index_id(), tablet.partition_id());
89
0
}
90
91
void TabletHotspot::count(int64_t tablet_id, int64_t table_id, int64_t index_id,
92
2
                          int64_t partition_id) {
93
2
    const uint64_t count_calls_total =
94
2
            _count_calls_total.fetch_add(1, std::memory_order_relaxed) + 1;
95
96
2
    size_t slot_idx = tablet_id % s_slot_size;
97
2
    auto& slot = _tablets_hotspot[slot_idx];
98
2
    bool should_log_new_counter = false;
99
2
    uint64_t new_counter_total = 0;
100
2
    {
101
2
        std::lock_guard lock(slot.mtx);
102
2
        HotspotCounterPtr counter;
103
2
        if (auto iter = slot.map.find(tablet_id); iter == slot.map.end()) {
104
2
            counter = std::make_shared<HotspotCounter>(table_id, index_id, partition_id);
105
2
            slot.map.insert(std::make_pair(tablet_id, counter));
106
2
            new_counter_total = _new_counter_total.fetch_add(1, std::memory_order_relaxed) + 1;
107
2
            should_log_new_counter = (new_counter_total % kNewCounterLogInterval == 0);
108
2
        } else {
109
0
            counter = iter->second;
110
0
            _existing_hit_total.fetch_add(1, std::memory_order_relaxed);
111
0
        }
112
2
        counter->last_access_time = std::chrono::system_clock::now();
113
2
        counter->cur_counter.fetch_add(1, std::memory_order_relaxed);
114
2
    }
115
116
2
    if (should_log_new_counter) {
117
0
        LOG(INFO) << "tablet_hotspot_diag new_counter_total=" << new_counter_total
118
0
                  << " count_calls_total=" << count_calls_total
119
0
                  << " existing_hit_total=" << _existing_hit_total.load(std::memory_order_relaxed);
120
0
    }
121
2
    if (count_calls_total % kCountHeartbeatInterval == 0) {
122
0
        LOG(INFO) << "tablet_hotspot_diag count_heartbeat count_calls_total=" << count_calls_total
123
0
                  << " existing_hit_total=" << _existing_hit_total.load(std::memory_order_relaxed)
124
0
                  << " new_counter_total=" << _new_counter_total.load(std::memory_order_relaxed);
125
0
    }
126
2
}
127
128
12
TabletHotspot::TabletHotspot(bool start_counter_thread) {
129
12
    if (start_counter_thread) {
130
0
        _counter_thread = std::thread(&TabletHotspot::make_dot_point, this);
131
0
    }
132
12
}
133
134
12
TabletHotspot::~TabletHotspot() {
135
12
    {
136
12
        std::lock_guard lock(_mtx);
137
12
        _closed = true;
138
12
    }
139
12
    _cond.notify_all();
140
12
    if (_counter_thread.joinable()) {
141
0
        _counter_thread.join();
142
0
    }
143
12
}
144
145
void get_return_partitions(
146
        const std::unordered_map<TabletHotspotMapKey,
147
                                 std::unordered_map<int64_t, TabletHotspotMapValue>, MapKeyHash>&
148
                hot_partition,
149
        const std::unordered_map<TabletHotspotMapKey,
150
                                 std::unordered_map<int64_t, TabletHotspotMapValue>, MapKeyHash>&
151
                last_hot_partition,
152
8
        std::vector<THotTableMessage>* hot_tables, int& return_partitions, int N) {
153
8
    for (const auto& [key, partition_to_value] : hot_partition) {
154
4
        THotTableMessage msg;
155
4
        msg.table_id = key.first;
156
4
        msg.index_id = key.second;
157
4
        for (const auto& [partition_id, value] : partition_to_value) {
158
4
            if (return_partitions > N) {
159
0
                return;
160
0
            }
161
4
            auto last_value_iter = last_hot_partition.find(key);
162
4
            if (last_value_iter != last_hot_partition.end()) {
163
0
                auto last_partition_iter = last_value_iter->second.find(partition_id);
164
0
                if (last_partition_iter != last_value_iter->second.end()) {
165
0
                    const auto& last_value = last_partition_iter->second;
166
0
                    if (std::abs(static_cast<int64_t>(value.qpd) -
167
0
                                 static_cast<int64_t>(last_value.qpd)) < 5 &&
168
0
                        std::abs(static_cast<int64_t>(value.qpw) -
169
0
                                 static_cast<int64_t>(last_value.qpw)) < 10 &&
170
0
                        std::abs(static_cast<int64_t>(value.last_access_time) -
171
0
                                 static_cast<int64_t>(last_value.last_access_time)) < 60) {
172
0
                        LOG(INFO) << "skip partition_id=" << partition_id << " qpd=" << value.qpd
173
0
                                  << " qpw=" << value.qpw
174
0
                                  << " last_access_time=" << value.last_access_time
175
0
                                  << " last_qpd=" << last_value.qpd
176
0
                                  << " last_qpw=" << last_value.qpw
177
0
                                  << " last_access_time=" << last_value.last_access_time;
178
0
                        continue;
179
0
                    }
180
0
                }
181
0
            }
182
4
            THotPartition new_hot_partition;
183
4
            new_hot_partition.__set_partition_id(partition_id);
184
4
            new_hot_partition.__set_query_per_day(value.qpd);
185
4
            new_hot_partition.__set_query_per_week(value.qpw);
186
4
            new_hot_partition.__set_last_access_time(value.last_access_time);
187
4
            msg.hot_partitions.push_back(new_hot_partition);
188
4
            return_partitions++;
189
4
        }
190
4
        msg.__isset.hot_partitions = !msg.hot_partitions.empty();
191
4
        hot_tables->push_back(std::move(msg));
192
4
    }
193
8
}
194
195
4
void TabletHotspot::get_top_n_hot_partition(std::vector<THotTableMessage>* hot_tables) {
196
4
    const uint64_t call_id =
197
4
            _get_top_n_hot_partition_call_total.fetch_add(1, std::memory_order_relaxed) + 1;
198
4
    uint64_t last_day_tables_before = 0;
199
4
    uint64_t last_day_entries_before = 0;
200
4
    uint64_t last_week_tables_before = 0;
201
4
    uint64_t last_week_entries_before = 0;
202
4
    {
203
4
        std::lock_guard lock(_last_partitions_mtx);
204
4
        last_day_tables_before = _last_day_hot_partitions.size();
205
4
        last_day_entries_before = count_hot_partition_entries(_last_day_hot_partitions);
206
4
        last_week_tables_before = _last_week_hot_partitions.size();
207
4
        last_week_entries_before = count_hot_partition_entries(_last_week_hot_partitions);
208
4
    }
209
4
    const int64_t process_mem_before = process_memory_usage_for_diag();
210
211
    // map<pair<table_id, index_id>, map<partition_id, value>> for day
212
4
    std::unordered_map<TabletHotspotMapKey, std::unordered_map<int64_t, TabletHotspotMapValue>,
213
4
                       MapKeyHash>
214
4
            day_hot_partitions;
215
    // map<pair<table_id, index_id>, map<partition_id, value>> for week
216
4
    std::unordered_map<TabletHotspotMapKey, std::unordered_map<int64_t, TabletHotspotMapValue>,
217
4
                       MapKeyHash>
218
4
            week_hot_partitions;
219
220
4.09k
    std::for_each(_tablets_hotspot.begin(), _tablets_hotspot.end(), [&](HotspotMap& map) {
221
4.09k
        std::lock_guard lock(map.mtx);
222
4.09k
        for (auto& [_, counter] : map.map) {
223
6
            if (counter->qpd() != 0) {
224
4
                auto& hot_partition = day_hot_partitions[std::make_pair(
225
4
                        counter->table_id, counter->index_id)][counter->partition_id];
226
4
                hot_partition.qpd = std::max(hot_partition.qpd, counter->qpd());
227
4
                hot_partition.qpw = std::max(hot_partition.qpw, counter->qpw());
228
4
                hot_partition.last_access_time =
229
4
                        std::max<int64_t>(hot_partition.last_access_time,
230
4
                                          std::chrono::duration_cast<std::chrono::seconds>(
231
4
                                                  counter->last_access_time.time_since_epoch())
232
4
                                                  .count());
233
4
            } else if (counter->qpw() != 0) {
234
0
                auto& hot_partition = week_hot_partitions[std::make_pair(
235
0
                        counter->table_id, counter->index_id)][counter->partition_id];
236
0
                hot_partition.qpd = 0;
237
0
                hot_partition.qpw = std::max(hot_partition.qpw, counter->qpw());
238
0
                hot_partition.last_access_time =
239
0
                        std::max<int64_t>(hot_partition.last_access_time,
240
0
                                          std::chrono::duration_cast<std::chrono::seconds>(
241
0
                                                  counter->last_access_time.time_since_epoch())
242
0
                                                  .count());
243
0
            }
244
6
        }
245
4.09k
    });
246
4
    constexpr int N = 50;
247
4
    int return_partitions = 0;
248
4
    const uint64_t day_tables_built = day_hot_partitions.size();
249
4
    const uint64_t day_entries_built = count_hot_partition_entries(day_hot_partitions);
250
4
    const uint64_t week_tables_built = week_hot_partitions.size();
251
4
    const uint64_t week_entries_built = count_hot_partition_entries(week_hot_partitions);
252
4
    uint64_t last_day_tables_after = 0;
253
4
    uint64_t last_day_entries_after = 0;
254
4
    uint64_t last_week_tables_after = 0;
255
4
    uint64_t last_week_entries_after = 0;
256
257
4
    {
258
4
        std::unique_lock lock(_last_partitions_mtx);
259
4
        get_return_partitions(day_hot_partitions, _last_day_hot_partitions, hot_tables,
260
4
                              return_partitions, N);
261
4
        get_return_partitions(week_hot_partitions, _last_week_hot_partitions, hot_tables,
262
4
                              return_partitions, N);
263
264
4
        _last_day_hot_partitions = std::move(day_hot_partitions);
265
4
        _last_week_hot_partitions = std::move(week_hot_partitions);
266
4
        last_day_tables_after = _last_day_hot_partitions.size();
267
4
        last_day_entries_after = count_hot_partition_entries(_last_day_hot_partitions);
268
4
        last_week_tables_after = _last_week_hot_partitions.size();
269
4
        last_week_entries_after = count_hot_partition_entries(_last_week_hot_partitions);
270
4
    }
271
272
4
    const int64_t process_mem_after = process_memory_usage_for_diag();
273
274
4
    LOG(INFO) << "tablet_hotspot_diag get_top_n_hot_partition call_id=" << call_id
275
4
              << " day_tables_built=" << day_tables_built
276
4
              << " day_entries_built=" << day_entries_built
277
4
              << " week_tables_built=" << week_tables_built
278
4
              << " week_entries_built=" << week_entries_built
279
4
              << " returned_partitions=" << return_partitions
280
4
              << " last_day_tables_before=" << last_day_tables_before
281
4
              << " last_day_entries_before=" << last_day_entries_before
282
4
              << " last_day_tables_after=" << last_day_tables_after
283
4
              << " last_day_entries_after=" << last_day_entries_after
284
4
              << " last_week_tables_before=" << last_week_tables_before
285
4
              << " last_week_entries_before=" << last_week_entries_before
286
4
              << " last_week_tables_after=" << last_week_tables_after
287
4
              << " last_week_entries_after=" << last_week_entries_after
288
4
              << " process_mem_before_mb=" << bytes_to_mb(process_mem_before)
289
4
              << " process_mem_after_mb=" << bytes_to_mb(process_mem_after);
290
4
}
291
292
522
void HotspotCounter::make_dot_point() {
293
522
    uint64_t value = cur_counter.exchange(0, std::memory_order_acq_rel);
294
522
    if (history_counters.size() == week_counters_size) {
295
0
        uint64_t week_counter_remove = history_counters.back();
296
0
        uint64_t day_counter_remove = history_counters[day_counters_size - 1];
297
0
        week_history_counter = week_history_counter - week_counter_remove + value;
298
0
        day_history_counter = day_history_counter - day_counter_remove + value;
299
0
        history_counters.pop_back();
300
522
    } else if (history_counters.size() < day_counters_size) {
301
522
        week_history_counter += value;
302
522
        day_history_counter += value;
303
522
    } else {
304
0
        week_history_counter += value;
305
0
        uint64_t day_counter_remove = history_counters[day_counters_size - 1];
306
0
        day_history_counter = day_history_counter - day_counter_remove + value;
307
0
    }
308
522
    history_counters.push_front(value);
309
522
}
310
311
10
uint64_t HotspotCounter::qpd() {
312
10
    return day_history_counter + cur_counter.load();
313
10
}
314
315
6
uint64_t HotspotCounter::qpw() {
316
6
    return week_history_counter + cur_counter.load();
317
6
}
318
319
528
bool TabletHotspot::is_gc_eligible(const HotspotCounter& counter, SystemTimePoint now) {
320
528
    const auto week_window = std::chrono::seconds((HotspotCounter::week_counters_size + 1) *
321
528
                                                  HotspotCounter::time_interval);
322
528
    return counter.last_access_time < now - week_window &&
323
528
           counter.cur_counter.load(std::memory_order_relaxed) == 0 &&
324
528
           counter.day_history_counter.load(std::memory_order_relaxed) == 0 &&
325
528
           counter.week_history_counter.load(std::memory_order_relaxed) == 0;
326
528
}
327
328
10
TabletHotspot::MaintenanceStats TabletHotspot::run_maintenance_once(SystemTimePoint now) {
329
10
    MaintenanceStats stats;
330
10
    auto gc_elapsed = SteadyClock::duration::zero();
331
332
10.2k
    for (size_t slot_idx = 0; slot_idx < s_slot_size; ++slot_idx) {
333
10.2k
        auto& slot = _tablets_hotspot[slot_idx];
334
10.2k
        std::vector<HotspotCounterPtr> counters;
335
10.2k
        size_t slot_size_before = 0;
336
10.2k
        size_t slot_bucket_count_before = 0;
337
338
10.2k
        {
339
10.2k
            std::lock_guard lock(slot.mtx);
340
10.2k
            slot_size_before = slot.map.size();
341
10.2k
            slot_bucket_count_before = slot.map.bucket_count();
342
10.2k
            stats.total_counters_before_gc += slot_size_before;
343
10.2k
            if (slot_size_before > 0) {
344
12
                ++stats.non_empty_slots_before_gc;
345
12
            }
346
10.2k
            stats.max_slot_size_before_gc =
347
10.2k
                    std::max<uint64_t>(stats.max_slot_size_before_gc, slot_size_before);
348
10.2k
            stats.sum_bucket_count_before_gc += slot_bucket_count_before;
349
10.2k
            counters.reserve(slot_size_before);
350
10.2k
            for (auto& [_, counter] : slot.map) {
351
522
                counters.push_back(counter);
352
522
            }
353
10.2k
        }
354
10.2k
        stats.copied_counters += counters.size();
355
10.2k
        std::for_each(counters.begin(), counters.end(),
356
10.2k
                      [](HotspotCounterPtr& counter) { counter->make_dot_point(); });
357
358
10.2k
        size_t erased_count = 0;
359
10.2k
        bool compacted = false;
360
10.2k
        size_t slot_size_after = 0;
361
10.2k
        size_t slot_bucket_count_after = 0;
362
10.2k
        auto gc_start = SteadyClock::now();
363
10.2k
        {
364
10.2k
            std::lock_guard lock(slot.mtx);
365
10.7k
            for (auto iter = slot.map.begin(); iter != slot.map.end();) {
366
522
                if (is_gc_eligible(*iter->second, now)) {
367
518
                    iter = slot.map.erase(iter);
368
518
                    ++erased_count;
369
518
                } else {
370
4
                    ++iter;
371
4
                }
372
522
            }
373
374
10.2k
            if (should_compact_slot(slot_size_before, slot.map.size(), slot.map.bucket_count(),
375
10.2k
                                    erased_count)) {
376
8
                decltype(slot.map) compacted_map;
377
8
                compacted_map.max_load_factor(slot.map.max_load_factor());
378
8
                compacted_map.reserve(slot.map.size());
379
8
                for (const auto& [tablet_id, counter] : slot.map) {
380
0
                    compacted_map.emplace(tablet_id, counter);
381
0
                }
382
8
                slot.map.swap(compacted_map);
383
8
                compacted = true;
384
8
            }
385
386
10.2k
            slot_size_after = slot.map.size();
387
10.2k
            slot_bucket_count_after = slot.map.bucket_count();
388
10.2k
            stats.total_counters_after_gc += slot_size_after;
389
10.2k
            if (slot_size_after > 0) {
390
4
                ++stats.non_empty_slots_after_gc;
391
4
            }
392
10.2k
            stats.max_slot_size_after_gc =
393
10.2k
                    std::max<uint64_t>(stats.max_slot_size_after_gc, slot_size_after);
394
10.2k
            stats.sum_bucket_count_after_gc += slot_bucket_count_after;
395
10.2k
        }
396
10.2k
        gc_elapsed += SteadyClock::now() - gc_start;
397
398
10.2k
        stats.evicted_counters += erased_count;
399
10.2k
        if (compacted) {
400
8
            ++stats.compacted_slots;
401
8
        }
402
10.2k
        if (erased_count > 0 || compacted) {
403
8
            LOG(INFO) << "tablet_hotspot_diag gc_slot"
404
8
                      << " slot_idx=" << slot_idx << " slot_size_before=" << slot_size_before
405
8
                      << " slot_size_after=" << slot_size_after
406
8
                      << " bucket_count_before=" << slot_bucket_count_before
407
8
                      << " bucket_count_after=" << slot_bucket_count_after
408
8
                      << " erased_count=" << erased_count << " compacted=" << compacted;
409
8
        }
410
10.2k
    }
411
412
10
    stats.gc_elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(gc_elapsed).count();
413
10
    return stats;
414
10
}
415
416
0
void TabletHotspot::make_dot_point() {
417
0
    while (true) {
418
0
        {
419
0
            std::unique_lock lock(_mtx);
420
0
            _cond.wait_for(lock, std::chrono::seconds(HotspotCounter::time_interval),
421
0
                           [this]() { return _closed; });
422
0
            if (_closed) {
423
0
                break;
424
0
            }
425
0
        }
426
427
0
        const uint64_t round =
428
0
                _make_dot_point_round_total.fetch_add(1, std::memory_order_relaxed) + 1;
429
0
        const uint64_t count_calls_total = _count_calls_total.load(std::memory_order_relaxed);
430
0
        const uint64_t existing_hit_total = _existing_hit_total.load(std::memory_order_relaxed);
431
0
        const uint64_t new_counter_total_before =
432
0
                _new_counter_total.load(std::memory_order_relaxed);
433
0
        const int64_t process_mem_before = process_memory_usage_for_diag();
434
435
0
        const auto now = std::chrono::system_clock::now();
436
0
        const MaintenanceStats stats = run_maintenance_once(now);
437
438
0
        const int64_t process_mem_after = process_memory_usage_for_diag();
439
0
        const uint64_t new_counter_total_after = _new_counter_total.load(std::memory_order_relaxed);
440
0
        const uint64_t prev_round_new_counter_total = _last_round_new_counter_total.exchange(
441
0
                new_counter_total_after, std::memory_order_relaxed);
442
0
        const uint64_t new_counter_delta =
443
0
                new_counter_total_after >= prev_round_new_counter_total
444
0
                        ? (new_counter_total_after - prev_round_new_counter_total)
445
0
                        : 0;
446
447
0
        LOG(INFO) << "tablet_hotspot_diag make_dot_point round=" << round
448
0
                  << " total_counters=" << stats.total_counters_before_gc
449
0
                  << " total_counters_before_gc=" << stats.total_counters_before_gc
450
0
                  << " total_counters_after_gc=" << stats.total_counters_after_gc
451
0
                  << " non_empty_slots=" << stats.non_empty_slots_before_gc
452
0
                  << " non_empty_slots_before_gc=" << stats.non_empty_slots_before_gc
453
0
                  << " non_empty_slots_after_gc=" << stats.non_empty_slots_after_gc
454
0
                  << " max_slot_size=" << stats.max_slot_size_before_gc
455
0
                  << " max_slot_size_before_gc=" << stats.max_slot_size_before_gc
456
0
                  << " max_slot_size_after_gc=" << stats.max_slot_size_after_gc
457
0
                  << " sum_bucket_count=" << stats.sum_bucket_count_before_gc
458
0
                  << " sum_bucket_count_before_gc=" << stats.sum_bucket_count_before_gc
459
0
                  << " sum_bucket_count_after_gc=" << stats.sum_bucket_count_after_gc
460
0
                  << " copied_counters=" << stats.copied_counters
461
0
                  << " evicted_counters=" << stats.evicted_counters << " evicted_ratio="
462
0
                  << ratio_or_zero(stats.evicted_counters, stats.total_counters_before_gc)
463
0
                  << " compacted_slots=" << stats.compacted_slots << " bucket_reclaim_ratio="
464
0
                  << ratio_or_zero(
465
0
                             stats.sum_bucket_count_before_gc >= stats.sum_bucket_count_after_gc
466
0
                                     ? (stats.sum_bucket_count_before_gc -
467
0
                                        stats.sum_bucket_count_after_gc)
468
0
                                     : 0,
469
0
                             stats.sum_bucket_count_before_gc)
470
0
                  << " gc_elapsed_ms=" << stats.gc_elapsed_ms
471
0
                  << " count_calls_total=" << count_calls_total
472
0
                  << " existing_hit_total=" << existing_hit_total
473
0
                  << " new_counter_total_before=" << new_counter_total_before
474
0
                  << " new_counter_total_after=" << new_counter_total_after
475
0
                  << " new_counter_delta=" << new_counter_delta
476
0
                  << " process_mem_before_mb=" << bytes_to_mb(process_mem_before)
477
0
                  << " process_mem_after_mb=" << bytes_to_mb(process_mem_after);
478
0
    }
479
0
}
480
481
} // namespace doris