Skip to content

Commit 2dace7a

Browse files
authored
[fix](cache) always create data and index page cache to avoid null pointer (#59266)
1 parent 1dc9bbd commit 2dace7a

File tree

3 files changed

+116
-10
lines changed

3 files changed

+116
-10
lines changed

be/src/olap/page_cache.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,21 @@ StoragePageCache* StoragePageCache::create_global_cache(size_t capacity,
8282
StoragePageCache::StoragePageCache(size_t capacity, int32_t index_cache_percentage,
8383
int64_t pk_index_cache_capacity, uint32_t num_shards)
8484
: _index_cache_percentage(index_cache_percentage) {
85+
size_t data_page_capacity = 0;
86+
size_t index_page_capacity = 0;
8587
if (index_cache_percentage == 0) {
86-
_data_page_cache = std::make_unique<DataPageCache>(capacity, num_shards);
88+
data_page_capacity = capacity;
8789
} else if (index_cache_percentage == 100) {
88-
_index_page_cache = std::make_unique<IndexPageCache>(capacity, num_shards);
90+
index_page_capacity = capacity;
8991
} else if (index_cache_percentage > 0 && index_cache_percentage < 100) {
90-
_data_page_cache = std::make_unique<DataPageCache>(
91-
capacity * (100 - index_cache_percentage) / 100, num_shards);
92-
_index_page_cache = std::make_unique<IndexPageCache>(
93-
capacity * index_cache_percentage / 100, num_shards);
92+
data_page_capacity = capacity * (100 - index_cache_percentage) / 100;
93+
index_page_capacity = capacity * index_cache_percentage / 100;
9494
} else {
9595
CHECK(false) << "invalid index page cache percentage";
9696
}
9797

98+
_data_page_cache = std::make_unique<DataPageCache>(data_page_capacity, num_shards);
99+
_index_page_cache = std::make_unique<IndexPageCache>(index_page_capacity, num_shards);
98100
_pk_index_page_cache = std::make_unique<PKIndexPageCache>(pk_index_cache_capacity, num_shards);
99101
}
100102

be/src/runtime/memory/lru_cache_policy.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -74,11 +74,11 @@ class LRUCachePolicy : public CachePolicy {
7474
void reset_cache() { _cache.reset(); }
7575

7676
bool check_capacity(size_t capacity, uint32_t num_shards) {
77-
if (capacity < num_shards) {
77+
if (capacity == 0 || capacity < num_shards) {
7878
LOG(INFO) << fmt::format(
79-
"{} lru cache capacity({} B) less than num_shards({}), init failed, will be "
80-
"disabled.",
81-
type_string(type()), capacity, num_shards);
79+
"{} lru cache capacity({} B) {} num_shards({}), will be disabled.",
80+
type_string(type()), capacity, capacity == 0 ? "is 0, ignore" : "less than",
81+
num_shards);
8282
_enable_prune = false;
8383
return false;
8484
}

be/test/olap/page_cache_test.cpp

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,4 +286,108 @@ TEST_F(StoragePageCacheTest, mixed_pages) {
286286
}
287287
}
288288

289+
TEST_F(StoragePageCacheTest, zero_index_cache_percentage) {
290+
StoragePageCache cache(kNumShards * 2048, 0, 0, kNumShards);
291+
292+
StoragePageCache::CacheKey data_key("data", 0, 0);
293+
StoragePageCache::CacheKey index_key("index", 0, 0);
294+
295+
segment_v2::PageTypePB page_type_data = segment_v2::DATA_PAGE;
296+
segment_v2::PageTypePB page_type_index = segment_v2::INDEX_PAGE;
297+
298+
{
299+
PageCacheHandle handle;
300+
auto* data = new DataPage(1024, true, page_type_data);
301+
cache.insert(data_key, data, &handle, page_type_data, false);
302+
auto found = cache.lookup(data_key, &handle, page_type_data);
303+
EXPECT_TRUE(found);
304+
}
305+
306+
{
307+
PageCacheHandle handle;
308+
auto* index = new DataPage(1024, true, page_type_index);
309+
cache.insert(index_key, index, &handle, page_type_index, false);
310+
auto found = cache.lookup(index_key, &handle, page_type_index);
311+
EXPECT_FALSE(found);
312+
}
313+
}
314+
315+
TEST_F(StoragePageCacheTest, full_index_cache_percentage) {
316+
StoragePageCache cache(kNumShards * 2048, 100, 0, kNumShards);
317+
318+
StoragePageCache::CacheKey data_key("data", 0, 0);
319+
StoragePageCache::CacheKey index_key("index", 0, 0);
320+
321+
segment_v2::PageTypePB page_type_data = segment_v2::DATA_PAGE;
322+
segment_v2::PageTypePB page_type_index = segment_v2::INDEX_PAGE;
323+
324+
{
325+
PageCacheHandle handle;
326+
auto* data = new DataPage(1024, true, page_type_data);
327+
cache.insert(data_key, data, &handle, page_type_data, false);
328+
auto found = cache.lookup(data_key, &handle, page_type_data);
329+
EXPECT_FALSE(found);
330+
}
331+
332+
{
333+
PageCacheHandle handle;
334+
auto* index = new DataPage(1024, true, page_type_index);
335+
cache.insert(index_key, index, &handle, page_type_index, false);
336+
auto found = cache.lookup(index_key, &handle, page_type_index);
337+
EXPECT_TRUE(found);
338+
}
339+
}
340+
341+
TEST_F(StoragePageCacheTest, zero_total_capacity) {
342+
StoragePageCache cache(0, 50, 0, kNumShards);
343+
344+
StoragePageCache::CacheKey data_key("data", 0, 0);
345+
StoragePageCache::CacheKey index_key("index", 0, 0);
346+
347+
segment_v2::PageTypePB page_type_data = segment_v2::DATA_PAGE;
348+
segment_v2::PageTypePB page_type_index = segment_v2::INDEX_PAGE;
349+
350+
{
351+
PageCacheHandle handle;
352+
auto* data = new DataPage(1024, true, page_type_data);
353+
cache.insert(data_key, data, &handle, page_type_data, false);
354+
auto found = cache.lookup(data_key, &handle, page_type_data);
355+
EXPECT_FALSE(found);
356+
}
357+
358+
{
359+
PageCacheHandle handle;
360+
auto* index = new DataPage(1024, true, page_type_index);
361+
cache.insert(index_key, index, &handle, page_type_index, false);
362+
auto found = cache.lookup(index_key, &handle, page_type_index);
363+
EXPECT_FALSE(found);
364+
}
365+
}
366+
367+
TEST_F(StoragePageCacheTest, capacity_less_than_num_shards) {
368+
StoragePageCache cache(10, 50, 0, kNumShards);
369+
370+
StoragePageCache::CacheKey data_key("data", 0, 0);
371+
StoragePageCache::CacheKey index_key("index", 0, 0);
372+
373+
segment_v2::PageTypePB page_type_data = segment_v2::DATA_PAGE;
374+
segment_v2::PageTypePB page_type_index = segment_v2::INDEX_PAGE;
375+
376+
{
377+
PageCacheHandle handle;
378+
auto* data = new DataPage(1024, true, page_type_data);
379+
cache.insert(data_key, data, &handle, page_type_data, false);
380+
auto found = cache.lookup(data_key, &handle, page_type_data);
381+
EXPECT_FALSE(found);
382+
}
383+
384+
{
385+
PageCacheHandle handle;
386+
auto* index = new DataPage(1024, true, page_type_index);
387+
cache.insert(index_key, index, &handle, page_type_index, false);
388+
auto found = cache.lookup(index_key, &handle, page_type_index);
389+
EXPECT_FALSE(found);
390+
}
391+
}
392+
289393
} // namespace doris

0 commit comments

Comments
 (0)