Coverage Report

Created: 2026-07-12 21:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
be/src/io/io_common.h
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
#pragma once
19
20
#include <gen_cpp/Types_types.h>
21
22
#include <set>
23
#include <string>
24
25
namespace doris {
26
27
enum class ReaderType : uint8_t {
28
    READER_QUERY = 0,
29
    READER_ALTER_TABLE = 1,
30
    READER_BASE_COMPACTION = 2,
31
    READER_CUMULATIVE_COMPACTION = 3,
32
    READER_CHECKSUM = 4,
33
    READER_COLD_DATA_COMPACTION = 5,
34
    READER_SEGMENT_COMPACTION = 6,
35
    READER_FULL_COMPACTION = 7,
36
    READER_BINLOG_COMPACTION = 8,
37
    READER_BINLOG = 9,
38
    UNKNOWN = 10
39
};
40
41
namespace io {
42
43
class RemoteScanCacheWriteLimiter;
44
45
enum class FileCacheMissPolicy : uint8_t {
46
    READ_THROUGH_AND_WRITE_BACK = 0,
47
    REMOTE_ONLY_ON_MISS = 1,
48
};
49
50
struct FileReaderStats {
51
    size_t read_calls = 0;
52
    size_t read_bytes = 0;
53
    int64_t read_time_ns = 0;
54
    size_t read_rows = 0;
55
};
56
57
struct FileCacheStatistics {
58
    int64_t num_local_io_total = 0;
59
    int64_t num_remote_io_total = 0;
60
    int64_t num_peer_io_total = 0;
61
    int64_t local_io_timer = 0;
62
    int64_t bytes_read_from_local = 0;
63
    int64_t bytes_read_from_remote = 0;
64
    int64_t bytes_read_from_peer = 0;
65
    int64_t remote_io_timer = 0;
66
    int64_t peer_io_timer = 0;
67
    int64_t remote_wait_timer = 0;
68
    int64_t write_cache_io_timer = 0;
69
    int64_t bytes_write_into_cache = 0;
70
    int64_t num_skip_cache_io_total = 0;
71
    int64_t read_cache_file_directly_timer = 0;
72
    int64_t cache_get_or_set_timer = 0;
73
    int64_t lock_wait_timer = 0;
74
    int64_t get_timer = 0;
75
    int64_t set_timer = 0;
76
77
    int64_t inverted_index_num_local_io_total = 0;
78
    int64_t inverted_index_num_remote_io_total = 0;
79
    int64_t inverted_index_num_peer_io_total = 0;
80
    int64_t inverted_index_bytes_read_from_local = 0;
81
    int64_t inverted_index_bytes_read_from_remote = 0;
82
    int64_t inverted_index_bytes_read_from_peer = 0;
83
    int64_t inverted_index_local_io_timer = 0;
84
    int64_t inverted_index_remote_io_timer = 0;
85
    int64_t inverted_index_peer_io_timer = 0;
86
    int64_t inverted_index_io_timer = 0;
87
    int64_t inverted_index_write_cache_io_timer = 0;
88
    int64_t inverted_index_bytes_write_into_cache = 0;
89
90
    int64_t segment_footer_index_num_local_io_total = 0;
91
    int64_t segment_footer_index_num_remote_io_total = 0;
92
    int64_t segment_footer_index_num_peer_io_total = 0;
93
    int64_t segment_footer_index_bytes_read_from_local = 0;
94
    int64_t segment_footer_index_bytes_read_from_remote = 0;
95
    int64_t segment_footer_index_bytes_read_from_peer = 0;
96
    int64_t segment_footer_index_local_io_timer = 0;
97
    int64_t segment_footer_index_remote_io_timer = 0;
98
    int64_t segment_footer_index_peer_io_timer = 0;
99
    int64_t segment_footer_index_write_cache_io_timer = 0;
100
    int64_t segment_footer_index_bytes_write_into_cache = 0;
101
    int64_t remote_only_on_miss_triggered = 0;
102
    int64_t remote_only_on_miss_threshold_bytes = 0;
103
104
    // Cross-CG / Same-CG peer read statistics
105
    int64_t num_cross_cg_peer_io_total = 0;
106
    int64_t bytes_read_from_cross_cg_peer = 0;
107
    int64_t cross_cg_peer_io_timer = 0; // nanoseconds
108
    int64_t num_same_cg_peer_io_total = 0;
109
    int64_t bytes_read_from_same_cg_peer = 0;
110
    int64_t same_cg_peer_io_timer = 0; // nanoseconds
111
    int64_t num_peer_race_peer_win = 0;
112
    int64_t num_peer_race_s3_win = 0;
113
    int64_t num_peer_lazy_fetch = 0;
114
    int64_t peer_lazy_fetch_timer = 0; // nanoseconds
115
116
    std::set<std::string> peer_hosts;
117
118
4.62M
    void merge_from(const FileCacheStatistics& other) {
119
4.62M
        num_local_io_total += other.num_local_io_total;
120
4.62M
        num_remote_io_total += other.num_remote_io_total;
121
4.62M
        num_peer_io_total += other.num_peer_io_total;
122
4.62M
        local_io_timer += other.local_io_timer;
123
4.62M
        bytes_read_from_local += other.bytes_read_from_local;
124
4.62M
        bytes_read_from_remote += other.bytes_read_from_remote;
125
4.62M
        bytes_read_from_peer += other.bytes_read_from_peer;
126
4.62M
        remote_io_timer += other.remote_io_timer;
127
4.62M
        peer_io_timer += other.peer_io_timer;
128
4.62M
        remote_wait_timer += other.remote_wait_timer;
129
4.62M
        write_cache_io_timer += other.write_cache_io_timer;
130
4.62M
        bytes_write_into_cache += other.bytes_write_into_cache;
131
4.62M
        num_skip_cache_io_total += other.num_skip_cache_io_total;
132
4.62M
        read_cache_file_directly_timer += other.read_cache_file_directly_timer;
133
4.62M
        cache_get_or_set_timer += other.cache_get_or_set_timer;
134
4.62M
        lock_wait_timer += other.lock_wait_timer;
135
4.62M
        get_timer += other.get_timer;
136
4.62M
        set_timer += other.set_timer;
137
138
4.62M
        inverted_index_num_local_io_total += other.inverted_index_num_local_io_total;
139
4.62M
        inverted_index_num_remote_io_total += other.inverted_index_num_remote_io_total;
140
4.62M
        inverted_index_num_peer_io_total += other.inverted_index_num_peer_io_total;
141
4.62M
        inverted_index_bytes_read_from_local += other.inverted_index_bytes_read_from_local;
142
4.62M
        inverted_index_bytes_read_from_remote += other.inverted_index_bytes_read_from_remote;
143
4.62M
        inverted_index_bytes_read_from_peer += other.inverted_index_bytes_read_from_peer;
144
4.62M
        inverted_index_local_io_timer += other.inverted_index_local_io_timer;
145
4.62M
        inverted_index_remote_io_timer += other.inverted_index_remote_io_timer;
146
4.62M
        inverted_index_peer_io_timer += other.inverted_index_peer_io_timer;
147
4.62M
        inverted_index_io_timer += other.inverted_index_io_timer;
148
4.62M
        inverted_index_write_cache_io_timer += other.inverted_index_write_cache_io_timer;
149
4.62M
        inverted_index_bytes_write_into_cache += other.inverted_index_bytes_write_into_cache;
150
151
4.62M
        segment_footer_index_num_local_io_total += other.segment_footer_index_num_local_io_total;
152
4.62M
        segment_footer_index_num_remote_io_total += other.segment_footer_index_num_remote_io_total;
153
4.62M
        segment_footer_index_num_peer_io_total += other.segment_footer_index_num_peer_io_total;
154
4.62M
        segment_footer_index_bytes_read_from_local +=
155
4.62M
                other.segment_footer_index_bytes_read_from_local;
156
4.62M
        segment_footer_index_bytes_read_from_remote +=
157
4.62M
                other.segment_footer_index_bytes_read_from_remote;
158
4.62M
        segment_footer_index_bytes_read_from_peer +=
159
4.62M
                other.segment_footer_index_bytes_read_from_peer;
160
4.62M
        segment_footer_index_local_io_timer += other.segment_footer_index_local_io_timer;
161
4.62M
        segment_footer_index_remote_io_timer += other.segment_footer_index_remote_io_timer;
162
4.62M
        segment_footer_index_peer_io_timer += other.segment_footer_index_peer_io_timer;
163
4.62M
        segment_footer_index_write_cache_io_timer +=
164
4.62M
                other.segment_footer_index_write_cache_io_timer;
165
4.62M
        segment_footer_index_bytes_write_into_cache +=
166
4.62M
                other.segment_footer_index_bytes_write_into_cache;
167
4.62M
        remote_only_on_miss_triggered =
168
4.63M
                remote_only_on_miss_triggered || other.remote_only_on_miss_triggered;
169
4.62M
        if (other.remote_only_on_miss_threshold_bytes > remote_only_on_miss_threshold_bytes) {
170
0
            remote_only_on_miss_threshold_bytes = other.remote_only_on_miss_threshold_bytes;
171
0
        }
172
173
4.62M
        num_cross_cg_peer_io_total += other.num_cross_cg_peer_io_total;
174
4.62M
        bytes_read_from_cross_cg_peer += other.bytes_read_from_cross_cg_peer;
175
4.62M
        cross_cg_peer_io_timer += other.cross_cg_peer_io_timer;
176
4.62M
        num_same_cg_peer_io_total += other.num_same_cg_peer_io_total;
177
4.62M
        bytes_read_from_same_cg_peer += other.bytes_read_from_same_cg_peer;
178
4.62M
        same_cg_peer_io_timer += other.same_cg_peer_io_timer;
179
4.62M
        num_peer_race_peer_win += other.num_peer_race_peer_win;
180
4.62M
        num_peer_race_s3_win += other.num_peer_race_s3_win;
181
4.62M
        num_peer_lazy_fetch += other.num_peer_lazy_fetch;
182
4.62M
        peer_lazy_fetch_timer += other.peer_lazy_fetch_timer;
183
184
4.62M
        peer_hosts.insert(other.peer_hosts.begin(), other.peer_hosts.end());
185
4.62M
    }
186
};
187
188
struct IOContext {
189
    ReaderType reader_type = ReaderType::UNKNOWN;
190
    // FIXME(plat1ko): Seems `is_disposable` can be inferred from the `reader_type`?
191
    bool is_disposable = false;
192
    bool is_index_data = false;
193
    bool read_file_cache = true;
194
    // TODO(lightman): use following member variables to control file cache
195
    bool is_persistent = false;
196
    // stop reader when reading, used in some interrupted operations
197
    bool should_stop = false;
198
    int64_t expiration_time = 0;
199
    const TUniqueId* query_id = nullptr;             // Ref
200
    FileCacheStatistics* file_cache_stats = nullptr; // Ref
201
    FileReaderStats* file_reader_stats = nullptr;    // Ref
202
    bool is_inverted_index = false;
203
    // if is_dryrun, read IO will download data to cache but return no data to reader
204
    // useful to skip cache data read from local disk to accelarate warm up
205
    bool is_dryrun = false;
206
    // if `is_warmup` == true, this I/O request is from a warm up task
207
    bool is_warmup {false};
208
    int64_t condition_cache_filtered_rows = 0;
209
    // Rows removed by file-local predicate conjuncts inside FileReader/TableReader. Scanner-level
210
    // output filtering already records its own unselected rows; this counter carries the rows that
211
    // were filtered before the block returned to Scanner.
212
    int64_t predicate_filtered_rows = 0;
213
    // if true, bypass peer read / peer-vs-S3 race and read directly from remote storage
214
    bool bypass_peer_read {false};
215
    FileCacheMissPolicy file_cache_miss_policy = FileCacheMissPolicy::READ_THROUGH_AND_WRITE_BACK;
216
    RemoteScanCacheWriteLimiter* remote_scan_cache_write_limiter = nullptr; // Ref
217
};
218
219
} // namespace io
220
} // namespace doris