From c9e4a567f9dec4daabe0692999aed7146b44f0af Mon Sep 17 00:00:00 2001 From: Iraklis Psaroudakis Date: Sun, 6 Oct 2024 20:33:11 +0300 Subject: [PATCH] Fix bitset filter cache loading in Stateless As recognized in PR #113478 reviewing, the bitset filter cache was wrongly eagerly loaded only for fast refresh indices on index nodes. However, it should be eagerly loaded for any index that can be searched. This PR fixes this. --- .../index/cache/bitset/BitsetFilterCache.java | 11 ++++++++--- .../index/cache/bitset/BitSetFilterCacheTests.java | 3 ++- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/server/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java b/server/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java index c19e3ca353569..c96f1afc1923a 100644 --- a/server/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java +++ b/server/src/main/java/org/elasticsearch/index/cache/bitset/BitsetFilterCache.java @@ -105,9 +105,14 @@ static boolean shouldLoadRandomAccessFiltersEagerly(IndexSettings settings) { boolean loadFiltersEagerlySetting = settings.getValue(INDEX_LOAD_RANDOM_ACCESS_FILTERS_EAGERLY_SETTING); boolean isStateless = DiscoveryNode.isStateless(settings.getNodeSettings()); if (isStateless) { - return DiscoveryNode.hasRole(settings.getNodeSettings(), DiscoveryNodeRole.INDEX_ROLE) - && loadFiltersEagerlySetting - && INDEX_FAST_REFRESH_SETTING.get(settings.getSettings()); + // We would like to eagerly load filters when the index can get searched. In Stateless, searches can happen on a search node + // for regular non-fast-refresh indices, or on an index node for fast refresh indices. + boolean fastRefreshIndex = INDEX_FAST_REFRESH_SETTING.get(settings.getSettings()); + boolean fastRefreshIndexOnIndexNode = fastRefreshIndex + && DiscoveryNode.hasRole(settings.getNodeSettings(), DiscoveryNodeRole.INDEX_ROLE); + boolean nonFastRefreshIndexOnSearchNode = (fastRefreshIndex == false) + && DiscoveryNode.hasRole(settings.getNodeSettings(), DiscoveryNodeRole.SEARCH_ROLE); + return loadFiltersEagerlySetting && (fastRefreshIndexOnIndexNode || nonFastRefreshIndexOnSearchNode); } else { return loadFiltersEagerlySetting; } diff --git a/server/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java b/server/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java index 77635fd0312f8..06b51af7c27aa 100644 --- a/server/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java +++ b/server/src/test/java/org/elasticsearch/index/cache/bitset/BitSetFilterCacheTests.java @@ -276,7 +276,8 @@ public void testShouldLoadRandomAccessFiltersEagerly() { for (var isStateless : values) { if (isStateless) { assertEquals( - loadFiltersEagerly && indexFastRefresh && hasIndexRole, + loadFiltersEagerly + && ((indexFastRefresh && hasIndexRole) || (indexFastRefresh == false && hasIndexRole == false)), BitsetFilterCache.shouldLoadRandomAccessFiltersEagerly( bitsetFilterCacheSettings(isStateless, hasIndexRole, loadFiltersEagerly, indexFastRefresh) )