|
@@ -28,19 +28,27 @@ import org.apache.lucene.store.ByteBuffersDirectory;
|
|
|
import org.apache.lucene.store.Directory;
|
|
|
import org.apache.lucene.util.Accountable;
|
|
|
import org.apache.lucene.util.BitSet;
|
|
|
+import org.elasticsearch.cluster.metadata.IndexMetadata;
|
|
|
+import org.elasticsearch.cluster.node.DiscoveryNodeRole;
|
|
|
import org.elasticsearch.common.lucene.index.ElasticsearchDirectoryReader;
|
|
|
import org.elasticsearch.common.settings.Settings;
|
|
|
import org.elasticsearch.core.IOUtils;
|
|
|
+import org.elasticsearch.index.Index;
|
|
|
import org.elasticsearch.index.IndexSettings;
|
|
|
import org.elasticsearch.index.shard.ShardId;
|
|
|
import org.elasticsearch.lucene.util.MatchAllBitSet;
|
|
|
+import org.elasticsearch.node.NodeRoleSettings;
|
|
|
import org.elasticsearch.test.ESTestCase;
|
|
|
import org.elasticsearch.test.IndexSettingsModule;
|
|
|
|
|
|
import java.io.IOException;
|
|
|
+import java.util.List;
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
import java.util.concurrent.atomic.AtomicLong;
|
|
|
|
|
|
+import static org.elasticsearch.cluster.node.DiscoveryNode.STATELESS_ENABLED_SETTING_NAME;
|
|
|
+import static org.elasticsearch.index.IndexSettings.INDEX_FAST_REFRESH_SETTING;
|
|
|
+import static org.elasticsearch.index.cache.bitset.BitsetFilterCache.INDEX_LOAD_RANDOM_ACCESS_FILTERS_EAGERLY_SETTING;
|
|
|
import static org.hamcrest.Matchers.equalTo;
|
|
|
import static org.hamcrest.Matchers.greaterThan;
|
|
|
import static org.hamcrest.Matchers.hasSize;
|
|
@@ -259,4 +267,53 @@ public class BitSetFilterCacheTests extends ESTestCase {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ public void testShouldLoadRandomAccessFiltersEagerly() {
|
|
|
+ var values = List.of(true, false);
|
|
|
+ for (var hasIndexRole : values) {
|
|
|
+ for (var indexFastRefresh : values) {
|
|
|
+ for (var loadFiltersEagerly : values) {
|
|
|
+ for (var isStateless : values) {
|
|
|
+ if (isStateless) {
|
|
|
+ assertEquals(
|
|
|
+ loadFiltersEagerly && indexFastRefresh && hasIndexRole,
|
|
|
+ BitsetFilterCache.shouldLoadRandomAccessFiltersEagerly(
|
|
|
+ bitsetFilterCacheSettings(isStateless, hasIndexRole, loadFiltersEagerly, indexFastRefresh)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ } else {
|
|
|
+ assertEquals(
|
|
|
+ loadFiltersEagerly,
|
|
|
+ BitsetFilterCache.shouldLoadRandomAccessFiltersEagerly(
|
|
|
+ bitsetFilterCacheSettings(isStateless, hasIndexRole, loadFiltersEagerly, indexFastRefresh)
|
|
|
+ )
|
|
|
+ );
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private IndexSettings bitsetFilterCacheSettings(
|
|
|
+ boolean isStateless,
|
|
|
+ boolean hasIndexRole,
|
|
|
+ boolean loadFiltersEagerly,
|
|
|
+ boolean indexFastRefresh
|
|
|
+ ) {
|
|
|
+ var indexSettingsBuilder = Settings.builder().put(INDEX_LOAD_RANDOM_ACCESS_FILTERS_EAGERLY_SETTING.getKey(), loadFiltersEagerly);
|
|
|
+ if (isStateless) indexSettingsBuilder.put(INDEX_FAST_REFRESH_SETTING.getKey(), indexFastRefresh);
|
|
|
+
|
|
|
+ var nodeSettingsBuilder = Settings.builder()
|
|
|
+ .putList(
|
|
|
+ NodeRoleSettings.NODE_ROLES_SETTING.getKey(),
|
|
|
+ hasIndexRole ? DiscoveryNodeRole.INDEX_ROLE.roleName() : DiscoveryNodeRole.SEARCH_ROLE.roleName()
|
|
|
+ )
|
|
|
+ .put(STATELESS_ENABLED_SETTING_NAME, isStateless);
|
|
|
+
|
|
|
+ return IndexSettingsModule.newIndexSettings(
|
|
|
+ new Index("index", IndexMetadata.INDEX_UUID_NA_VALUE),
|
|
|
+ indexSettingsBuilder.build(),
|
|
|
+ nodeSettingsBuilder.build()
|
|
|
+ );
|
|
|
+ }
|
|
|
}
|