github-actions[bot] commented on code in PR #42451: URL: https://github.com/apache/doris/pull/42451#discussion_r1823913500
########## be/test/io/cache/block_file_cache_test.cpp: ########## @@ -4854,26 +4843,35 @@ TEST_F(BlockFileCacheTest, ttl_reserve_wo_evict_using_lru) { settings.query_queue_elements = 5; settings.index_queue_size = 30; settings.index_queue_elements = 5; - settings.disposable_queue_size = 0; - settings.disposable_queue_elements = 0; - settings.capacity = 60; + settings.disposable_queue_size = 30; + settings.disposable_queue_elements = 5; + settings.capacity = 90; settings.max_file_block_size = 30; settings.max_query_cache_size = 30; io::CacheContext context; context.query_id = query_id; auto key = io::BlockFileCache::hash("key1"); + auto key2 = io::BlockFileCache::hash("key2"); io::BlockFileCache cache(cache_base_path, settings); - context.cache_type = io::FileCacheType::TTL; - context.expiration_time = UnixSeconds() + 3600; - + auto sp = SyncPoint::get_instance(); Review Comment: warning: 'auto sp' can be declared as 'auto *sp' [readability-qualified-auto] ```suggestion s);auto * ``` ########## be/test/io/cache/block_file_cache_test.cpp: ########## @@ -4885,292 +4883,84 @@ io::FileBlock::State::DOWNLOADED); } context.cache_type = io::FileCacheType::TTL; - context.expiration_time = UnixSeconds() + 3600; - for (int64_t offset = 60; offset < 70; offset += 5) { - auto holder = cache.get_or_set(key, offset, 5, context); + int64_t cur_time = UnixSeconds(); + context.expiration_time = cur_time + 120; + for (int64_t offset = 45; offset < 90; offset += 5) { + auto holder = cache.get_or_set(key2, offset, 5, context); auto segments = fromHolder(holder); ASSERT_EQ(segments.size(), 1); assert_range(1, segments[0], io::FileBlock::Range(offset, offset + 4), - io::FileBlock::State::SKIP_CACHE); + io::FileBlock::State::EMPTY); + ASSERT_TRUE(segments[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(segments[0]); + assert_range(1, segments[0], io::FileBlock::Range(offset, offset + 4), + io::FileBlock::State::DOWNLOADED); } - - EXPECT_EQ(cache._cur_cache_size, 50); - EXPECT_EQ(cache._ttl_queue.cache_size, 0); + std::cout << cache.reset_capacity(30) << std::endl; + while (cache._async_clear_file_cache) + ; + EXPECT_EQ(cache._cur_cache_size, 30); Review Comment: warning: statement should be inside braces [readability-braces-around-statements] ```suggestion he) { ; } ``` ########## be/test/io/cache/block_file_cache_test.cpp: ########## @@ -5493,4 +5283,400 @@ } } +TEST_F(BlockFileCacheTest, populate_empty_cache_with_disposable) { + if (fs::exists(cache_base_path)) { + fs::remove_all(cache_base_path); + } + fs::create_directories(cache_base_path); + TUniqueId query_id; + query_id.hi = 1; + query_id.lo = 1; + io::FileCacheSettings settings; + + settings.ttl_queue_size = 5000000; + settings.ttl_queue_elements = 50000; + settings.query_queue_size = 3000000; + settings.query_queue_elements = 30000; + settings.index_queue_size = 1000000; + settings.index_queue_elements = 10000; + settings.disposable_queue_size = 1000000; + settings.disposable_queue_elements = 10000; + settings.capacity = 10000000; + settings.max_file_block_size = 100000; + settings.max_query_cache_size = 30; + + size_t limit = 1000000; + size_t cache_max = 10000000; + io::CacheContext context; + context.cache_type = io::FileCacheType::DISPOSABLE; + context.query_id = query_id; + // int64_t cur_time = UnixSeconds(); + // context.expiration_time = cur_time + 120; + auto key1 = io::BlockFileCache::hash("key1"); + io::BlockFileCache cache(cache_base_path, settings); + ASSERT_TRUE(cache.initialize()); + int i = 0; + for (; i < 100; i++) { + if (cache.get_async_open_success()) { + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + ASSERT_TRUE(cache.get_async_open_success()); + int64_t offset = 0; + // fill the cache to its limit + for (; offset < limit; offset += 100000) { + auto holder = cache.get_or_set(key1, offset, 100000, context); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(1, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(2, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + // grab more exceed the limit to max cache capacity + for (; offset < cache_max; offset += 100000) { + auto holder = cache.get_or_set(key1, offset, 100000, context); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(3, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(4, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + ASSERT_EQ(cache.get_stats_unsafe()["disposable_queue_curr_size"], cache_max); + ASSERT_EQ(cache.get_stats_unsafe()["ttl_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["index_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["normal_queue_curr_size"], 0); + ASSERT_EQ(cache._evict_by_self_lru_metrics_matrix[FileCacheType::DISPOSABLE]->get_value(), 0); + + // grab more exceed the cache capacity + size_t exceed = 2000000; + for (; offset < (cache_max + exceed); offset += 100000) { + auto holder = cache.get_or_set(key1, offset, 100000, context); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(5, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(6, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + ASSERT_EQ(cache.get_stats_unsafe()["disposable_queue_curr_size"], cache_max); + ASSERT_EQ(cache.get_stats_unsafe()["ttl_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["index_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["normal_queue_curr_size"], 0); + ASSERT_EQ(cache._evict_by_self_lru_metrics_matrix[FileCacheType::DISPOSABLE]->get_value(), + exceed); + + if (fs::exists(cache_base_path)) { + fs::remove_all(cache_base_path); + } +} + +TEST_F(BlockFileCacheTest, disposable_seize_after_normal) { + if (fs::exists(cache_base_path)) { + fs::remove_all(cache_base_path); + } + fs::create_directories(cache_base_path); + TUniqueId query_id; + query_id.hi = 1; + query_id.lo = 1; + io::FileCacheSettings settings; + + settings.ttl_queue_size = 5000000; + settings.ttl_queue_elements = 50000; + settings.query_queue_size = 3000000; + settings.query_queue_elements = 30000; + settings.index_queue_size = 1000000; + settings.index_queue_elements = 10000; + settings.disposable_queue_size = 1000000; + settings.disposable_queue_elements = 10000; + settings.capacity = 10000000; + settings.max_file_block_size = 100000; + settings.max_query_cache_size = 30; + + io::BlockFileCache cache(cache_base_path, settings); + ASSERT_TRUE(cache.initialize()); + int i = 0; + for (; i < 100; i++) { + if (cache.get_async_open_success()) { + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + ASSERT_TRUE(cache.get_async_open_success()); + + size_t limit = 1000000; + size_t cache_max = 10000000; + + io::CacheContext context1; + context1.cache_type = io::FileCacheType::NORMAL; + context1.query_id = query_id; + auto key1 = io::BlockFileCache::hash("key1"); + + int64_t offset = 0; + // fill the cache + for (; offset < cache_max; offset += 100000) { + auto holder = cache.get_or_set(key1, offset, 100000, context1); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(1, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(2, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + ASSERT_EQ(cache.get_stats_unsafe()["disposable_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["ttl_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["index_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["normal_queue_curr_size"], cache_max); + // our hero comes to the stage + io::CacheContext context2; + context2.cache_type = io::FileCacheType::DISPOSABLE; + context2.query_id = query_id; + auto key2 = io::BlockFileCache::hash("key2"); + offset = 0; + for (; offset < limit; offset += 100000) { + auto holder = cache.get_or_set(key2, offset, 100000, context2); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(3, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(4, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + ASSERT_EQ(cache.get_stats_unsafe()["disposable_queue_curr_size"], limit); + ASSERT_EQ(cache.get_stats_unsafe()["ttl_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["index_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["normal_queue_curr_size"], cache_max - limit); + ASSERT_EQ(cache._evict_by_size_metrics_matrix[FileCacheType::DISPOSABLE][FileCacheType::NORMAL] + ->get_value(), + limit); + + // grab more exceed the limit + size_t exceed = 2000000; + for (; offset < (limit + exceed); offset += 100000) { + auto holder = cache.get_or_set(key2, offset, 100000, context2); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(5, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(6, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + ASSERT_EQ(cache.get_stats_unsafe()["disposable_queue_curr_size"], limit); + ASSERT_EQ(cache.get_stats_unsafe()["ttl_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["index_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["normal_queue_curr_size"], cache_max - limit); + ASSERT_EQ(cache._evict_by_self_lru_metrics_matrix[FileCacheType::DISPOSABLE]->get_value(), + exceed); + + if (fs::exists(cache_base_path)) { + fs::remove_all(cache_base_path); + } +} + +TEST_F(BlockFileCacheTest, evict_privilege_order) { Review Comment: warning: function 'TEST_F' exceeds recommended size/complexity thresholds [readability-function-size] ```cpp ^ ``` <details> <summary>Additional context</summary> **be/test/io/cache/block_file_cache_test.cpp:5507:** 172 lines including whitespace and comments (threshold 80) ```cpp ^ ``` </details> ########## be/test/io/cache/block_file_cache_test.cpp: ########## @@ -4885,292 +4883,84 @@ io::FileBlock::State::DOWNLOADED); } context.cache_type = io::FileCacheType::TTL; - context.expiration_time = UnixSeconds() + 3600; - for (int64_t offset = 60; offset < 70; offset += 5) { - auto holder = cache.get_or_set(key, offset, 5, context); + int64_t cur_time = UnixSeconds(); + context.expiration_time = cur_time + 120; + for (int64_t offset = 45; offset < 90; offset += 5) { + auto holder = cache.get_or_set(key2, offset, 5, context); auto segments = fromHolder(holder); ASSERT_EQ(segments.size(), 1); assert_range(1, segments[0], io::FileBlock::Range(offset, offset + 4), - io::FileBlock::State::SKIP_CACHE); + io::FileBlock::State::EMPTY); + ASSERT_TRUE(segments[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(segments[0]); + assert_range(1, segments[0], io::FileBlock::Range(offset, offset + 4), + io::FileBlock::State::DOWNLOADED); } - - EXPECT_EQ(cache._cur_cache_size, 50); - EXPECT_EQ(cache._ttl_queue.cache_size, 0); + std::cout << cache.reset_capacity(30) << std::endl; + while (cache._async_clear_file_cache) + ; + EXPECT_EQ(cache._cur_cache_size, 30); if (fs::exists(cache_base_path)) { fs::remove_all(cache_base_path); } } -TEST_F(BlockFileCacheTest, ttl_reserve_with_evict_using_lru) { - config::file_cache_ttl_valid_check_interval_second = 4; - config::enable_ttl_cache_evict_using_lru = true; - +TEST_F(BlockFileCacheTest, change_cache_type1) { if (fs::exists(cache_base_path)) { fs::remove_all(cache_base_path); } fs::create_directories(cache_base_path); + auto sp = SyncPoint::get_instance(); Review Comment: warning: 'auto sp' can be declared as 'auto *sp' [readability-qualified-auto] ```suggestion h);auto * ``` ########## be/test/io/cache/block_file_cache_test.cpp: ########## @@ -5493,4 +5283,400 @@ } } +TEST_F(BlockFileCacheTest, populate_empty_cache_with_disposable) { Review Comment: warning: function 'TEST_F' exceeds recommended size/complexity thresholds [readability-function-size] ```cpp ^ ``` <details> <summary>Additional context</summary> **be/test/io/cache/block_file_cache_test.cpp:5285:** 103 lines including whitespace and comments (threshold 80) ```cpp ^ ``` </details> ########## be/test/io/cache/block_file_cache_test.cpp: ########## @@ -5493,4 +5283,400 @@ } } +TEST_F(BlockFileCacheTest, populate_empty_cache_with_disposable) { + if (fs::exists(cache_base_path)) { + fs::remove_all(cache_base_path); + } + fs::create_directories(cache_base_path); + TUniqueId query_id; + query_id.hi = 1; + query_id.lo = 1; + io::FileCacheSettings settings; + + settings.ttl_queue_size = 5000000; + settings.ttl_queue_elements = 50000; + settings.query_queue_size = 3000000; + settings.query_queue_elements = 30000; + settings.index_queue_size = 1000000; + settings.index_queue_elements = 10000; + settings.disposable_queue_size = 1000000; + settings.disposable_queue_elements = 10000; + settings.capacity = 10000000; + settings.max_file_block_size = 100000; + settings.max_query_cache_size = 30; + + size_t limit = 1000000; + size_t cache_max = 10000000; + io::CacheContext context; + context.cache_type = io::FileCacheType::DISPOSABLE; + context.query_id = query_id; + // int64_t cur_time = UnixSeconds(); + // context.expiration_time = cur_time + 120; + auto key1 = io::BlockFileCache::hash("key1"); + io::BlockFileCache cache(cache_base_path, settings); + ASSERT_TRUE(cache.initialize()); + int i = 0; + for (; i < 100; i++) { + if (cache.get_async_open_success()) { + break; + } + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + ASSERT_TRUE(cache.get_async_open_success()); + int64_t offset = 0; + // fill the cache to its limit + for (; offset < limit; offset += 100000) { + auto holder = cache.get_or_set(key1, offset, 100000, context); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(1, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(2, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + // grab more exceed the limit to max cache capacity + for (; offset < cache_max; offset += 100000) { + auto holder = cache.get_or_set(key1, offset, 100000, context); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(3, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(4, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + ASSERT_EQ(cache.get_stats_unsafe()["disposable_queue_curr_size"], cache_max); + ASSERT_EQ(cache.get_stats_unsafe()["ttl_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["index_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["normal_queue_curr_size"], 0); + ASSERT_EQ(cache._evict_by_self_lru_metrics_matrix[FileCacheType::DISPOSABLE]->get_value(), 0); + + // grab more exceed the cache capacity + size_t exceed = 2000000; + for (; offset < (cache_max + exceed); offset += 100000) { + auto holder = cache.get_or_set(key1, offset, 100000, context); + auto blocks = fromHolder(holder); + ASSERT_EQ(blocks.size(), 1); + + assert_range(5, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::EMPTY); + ASSERT_TRUE(blocks[0]->get_or_set_downloader() == io::FileBlock::get_caller_id()); + download(blocks[0]); + assert_range(6, blocks[0], io::FileBlock::Range(offset, offset + 99999), + io::FileBlock::State::DOWNLOADED); + + blocks.clear(); + } + ASSERT_EQ(cache.get_stats_unsafe()["disposable_queue_curr_size"], cache_max); + ASSERT_EQ(cache.get_stats_unsafe()["ttl_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["index_queue_curr_size"], 0); + ASSERT_EQ(cache.get_stats_unsafe()["normal_queue_curr_size"], 0); + ASSERT_EQ(cache._evict_by_self_lru_metrics_matrix[FileCacheType::DISPOSABLE]->get_value(), + exceed); + + if (fs::exists(cache_base_path)) { + fs::remove_all(cache_base_path); + } +} + +TEST_F(BlockFileCacheTest, disposable_seize_after_normal) { Review Comment: warning: function 'TEST_F' exceeds recommended size/complexity thresholds [readability-function-size] ```cpp ^ ``` <details> <summary>Additional context</summary> **be/test/io/cache/block_file_cache_test.cpp:5390:** 115 lines including whitespace and comments (threshold 80) ```cpp ^ ``` </details> -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org