Skip to content

Commit cbde143

Browse files
gavinchouwyxxxcat
authored andcommitted
[fix](file cache) Fix slow IO for table stats procedure, introduced by apache#37141 (apache#39123)
Session variable `disable_file_cache` is processed as "disposable file cache" in beta_rowset_reader.cpp. ``` if (_read_context->runtime_state != nullptr) { _read_options.io_ctx.query_id = &_read_context->runtime_state->query_id(); _read_options.io_ctx.read_file_cache = _read_context->runtime_state->query_options().enable_file_cache; _read_options.io_ctx.is_disposable = _read_context->runtime_state->query_options().disable_file_cache; } ``` We use disposable cache to avoid IO amp and avoid large amount of eviction from the cached data ("normal cache"). We cannot set the read option cache policy to "no cache" because it may cause IO amp: every page IO will cause a remote IO, which is a performance disaster.
1 parent dc73ce7 commit cbde143

6 files changed

+18
-33
lines changed

be/src/olap/parallel_scanner_builder.cpp

+2-5
Original file line numberDiff line numberDiff line change
@@ -182,17 +182,14 @@ Status ParallelScannerBuilder::_load() {
182182
bool enable_segment_cache = _state->query_options().__isset.enable_segment_cache
183183
? _state->query_options().enable_segment_cache
184184
: true;
185-
bool disable_file_cache = _state->query_options().__isset.disable_file_cache
186-
? _state->query_options().disable_file_cache
187-
: false;
188185
for (auto& rowset : rowsets) {
189186
RETURN_IF_ERROR(rowset->load());
190187
const auto rowset_id = rowset->rowset_id();
191188
auto& segment_cache_handle = _segment_cache_handles[rowset_id];
192189

193190
RETURN_IF_ERROR(SegmentLoader::instance()->load_segments(
194191
std::dynamic_pointer_cast<BetaRowset>(rowset), &segment_cache_handle,
195-
enable_segment_cache, false, disable_file_cache));
192+
enable_segment_cache, false));
196193
_total_rows += rowset->num_rows();
197194
}
198195
}
@@ -211,4 +208,4 @@ std::shared_ptr<NewOlapScanner> ParallelScannerBuilder::_build_scanner(
211208
return NewOlapScanner::create_shared(_parent, std::move(params));
212209
}
213210

214-
} // namespace doris
211+
} // namespace doris

be/src/olap/rowset/beta_rowset.cpp

+7-11
Original file line numberDiff line numberDiff line change
@@ -147,26 +147,23 @@ Status BetaRowset::get_segments_size(std::vector<size_t>* segments_size) {
147147
return Status::OK();
148148
}
149149

150-
Status BetaRowset::load_segments(std::vector<segment_v2::SegmentSharedPtr>* segments,
151-
bool disable_file_cache) {
152-
return load_segments(0, num_segments(), segments, disable_file_cache);
150+
Status BetaRowset::load_segments(std::vector<segment_v2::SegmentSharedPtr>* segments) {
151+
return load_segments(0, num_segments(), segments);
153152
}
154153

155154
Status BetaRowset::load_segments(int64_t seg_id_begin, int64_t seg_id_end,
156-
std::vector<segment_v2::SegmentSharedPtr>* segments,
157-
bool disable_file_cache) {
155+
std::vector<segment_v2::SegmentSharedPtr>* segments) {
158156
int64_t seg_id = seg_id_begin;
159157
while (seg_id < seg_id_end) {
160158
std::shared_ptr<segment_v2::Segment> segment;
161-
RETURN_IF_ERROR(load_segment(seg_id, &segment, disable_file_cache));
159+
RETURN_IF_ERROR(load_segment(seg_id, &segment));
162160
segments->push_back(std::move(segment));
163161
seg_id++;
164162
}
165163
return Status::OK();
166164
}
167165

168-
Status BetaRowset::load_segment(int64_t seg_id, segment_v2::SegmentSharedPtr* segment,
169-
bool disable_file_cache) {
166+
Status BetaRowset::load_segment(int64_t seg_id, segment_v2::SegmentSharedPtr* segment) {
170167
auto fs = _rowset_meta->fs();
171168
if (!fs) {
172169
return Status::Error<INIT_FAILED>("get fs failed");
@@ -175,9 +172,8 @@ Status BetaRowset::load_segment(int64_t seg_id, segment_v2::SegmentSharedPtr* se
175172
DCHECK(seg_id >= 0);
176173
auto seg_path = DORIS_TRY(segment_path(seg_id));
177174
io::FileReaderOptions reader_options {
178-
.cache_type = !disable_file_cache && config::enable_file_cache
179-
? io::FileCachePolicy::FILE_BLOCK_CACHE
180-
: io::FileCachePolicy::NO_CACHE,
175+
.cache_type = config::enable_file_cache ? io::FileCachePolicy::FILE_BLOCK_CACHE
176+
: io::FileCachePolicy::NO_CACHE,
181177
.is_doris_table = true,
182178
.cache_base_path = "",
183179
.file_size = _rowset_meta->segment_file_size(seg_id),

be/src/olap/rowset/beta_rowset.h

+3-6
Original file line numberDiff line numberDiff line change
@@ -71,15 +71,12 @@ class BetaRowset final : public Rowset {
7171

7272
Status check_file_exist() override;
7373

74-
Status load_segments(std::vector<segment_v2::SegmentSharedPtr>* segments,
75-
bool disable_file_cache = false);
74+
Status load_segments(std::vector<segment_v2::SegmentSharedPtr>* segments);
7675

7776
Status load_segments(int64_t seg_id_begin, int64_t seg_id_end,
78-
std::vector<segment_v2::SegmentSharedPtr>* segments,
79-
bool disable_file_cache = false);
77+
std::vector<segment_v2::SegmentSharedPtr>* segments);
8078

81-
Status load_segment(int64_t seg_id, segment_v2::SegmentSharedPtr* segment,
82-
bool disable_file_cache = false);
79+
Status load_segment(int64_t seg_id, segment_v2::SegmentSharedPtr* segment);
8380

8481
Status get_segments_size(std::vector<size_t>* segments_size);
8582

be/src/olap/rowset/beta_rowset_reader.cpp

+3-7
Original file line numberDiff line numberDiff line change
@@ -249,13 +249,9 @@ Status BetaRowsetReader::get_segment_iterators(RowsetReaderContext* read_context
249249
}
250250

251251
// load segments
252-
bool disable_file_cache = false;
253252
bool enable_segment_cache = true;
254253
auto* state = read_context->runtime_state;
255254
if (state != nullptr) {
256-
disable_file_cache = state->query_options().__isset.disable_file_cache
257-
? state->query_options().disable_file_cache
258-
: false;
259255
enable_segment_cache = state->query_options().__isset.enable_segment_cache
260256
? state->query_options().enable_segment_cache
261257
: true;
@@ -264,9 +260,9 @@ Status BetaRowsetReader::get_segment_iterators(RowsetReaderContext* read_context
264260
bool should_use_cache = use_cache || (_read_context->reader_type == ReaderType::READER_QUERY &&
265261
enable_segment_cache);
266262
SegmentCacheHandle segment_cache_handle;
267-
RETURN_IF_ERROR(SegmentLoader::instance()->load_segments(
268-
_rowset, &segment_cache_handle, should_use_cache,
269-
/*need_load_pk_index_and_bf*/ false, disable_file_cache));
263+
RETURN_IF_ERROR(SegmentLoader::instance()->load_segments(_rowset, &segment_cache_handle,
264+
should_use_cache,
265+
/*need_load_pk_index_and_bf*/ false));
270266

271267
// create iterator for each segment
272268
auto& segments = segment_cache_handle.get_segments();

be/src/olap/segment_loader.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ void SegmentCache::erase(const SegmentCache::CacheKey& key) {
5252

5353
Status SegmentLoader::load_segments(const BetaRowsetSharedPtr& rowset,
5454
SegmentCacheHandle* cache_handle, bool use_cache,
55-
bool need_load_pk_index_and_bf, bool disable_file_cache) {
55+
bool need_load_pk_index_and_bf) {
5656
if (cache_handle->is_inited()) {
5757
return Status::OK();
5858
}
@@ -62,7 +62,7 @@ Status SegmentLoader::load_segments(const BetaRowsetSharedPtr& rowset,
6262
continue;
6363
}
6464
segment_v2::SegmentSharedPtr segment;
65-
RETURN_IF_ERROR(rowset->load_segment(i, &segment, disable_file_cache));
65+
RETURN_IF_ERROR(rowset->load_segment(i, &segment));
6666
if (need_load_pk_index_and_bf) {
6767
RETURN_IF_ERROR(segment->load_pk_index_and_bf());
6868
}

be/src/olap/segment_loader.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -118,8 +118,7 @@ class SegmentLoader {
118118
// Load segments of "rowset", return the "cache_handle" which contains segments.
119119
// If use_cache is true, it will be loaded from _cache.
120120
Status load_segments(const BetaRowsetSharedPtr& rowset, SegmentCacheHandle* cache_handle,
121-
bool use_cache = false, bool need_load_pk_index_and_bf = false,
122-
bool disable_file_cache = false);
121+
bool use_cache = false, bool need_load_pk_index_and_bf = false);
123122

124123
void erase_segment(const SegmentCache::CacheKey& key);
125124

0 commit comments

Comments
 (0)