diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/resident/ResidentFilterCache.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/resident/ResidentFilterCache.java new file mode 100644 index 00000000000..ce78ae1c8e8 --- /dev/null +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/resident/ResidentFilterCache.java @@ -0,0 +1,68 @@ +/* + * Licensed to Elastic Search and Shay Banon under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. Elastic Search licenses this + * file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.elasticsearch.index.cache.filter.resident; + +import org.apache.lucene.search.Filter; +import org.elasticsearch.common.collect.MapMaker; +import org.elasticsearch.common.inject.Inject; +import org.elasticsearch.common.lucene.docset.DocSet; +import org.elasticsearch.common.settings.Settings; +import org.elasticsearch.index.Index; +import org.elasticsearch.index.cache.filter.support.AbstractDoubleConcurrentMapFilterCache; +import org.elasticsearch.index.settings.IndexSettings; + +import java.util.concurrent.ConcurrentMap; + +/** + * A resident reference based filter cache that has soft keys on the IndexReader. + * + * @author kimchy (shay.banon) + */ +public class ResidentFilterCache extends AbstractDoubleConcurrentMapFilterCache { + + private final int maxSize; + + @Inject public ResidentFilterCache(Index index, @IndexSettings Settings indexSettings) { + super(index, indexSettings); + this.maxSize = componentSettings.getAsInt("max_size", 1000); + } + + @Override protected ConcurrentMap buildCacheMap() { + MapMaker mapMaker = new MapMaker(); + if (maxSize != -1) { + mapMaker.maximumSize(maxSize); + } + return mapMaker.makeMap(); + } + + @Override protected ConcurrentMap buildWeakCacheMap() { + // DocSet are not really stored with strong reference only when searching on them... + // Filter might be stored in query cache + MapMaker mapMaker = new MapMaker().weakValues(); + if (maxSize != -1) { + mapMaker.maximumSize(maxSize); + } + return mapMaker.makeMap(); + } + + @Override public String type() { + return "soft"; + } +} diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/soft/SoftFilterCache.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/soft/SoftFilterCache.java index 58662f3ef2c..287449dfc9b 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/soft/SoftFilterCache.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/soft/SoftFilterCache.java @@ -37,20 +37,31 @@ import java.util.concurrent.ConcurrentMap; */ public class SoftFilterCache extends AbstractDoubleConcurrentMapFilterCache { + private final int maxSize; + @Inject public SoftFilterCache(Index index, @IndexSettings Settings indexSettings) { super(index, indexSettings); + this.maxSize = componentSettings.getAsInt("max_size", -1); } @Override protected ConcurrentMap buildCacheMap() { // DocSet are not really stored with strong reference only when searching on them... // Filter might be stored in query cache - return new MapMaker().softValues().makeMap(); + MapMaker mapMaker = new MapMaker().softValues(); + if (maxSize != -1) { + mapMaker.maximumSize(maxSize); + } + return mapMaker.makeMap(); } @Override protected ConcurrentMap buildWeakCacheMap() { // DocSet are not really stored with strong reference only when searching on them... // Filter might be stored in query cache - return new MapMaker().weakValues().makeMap(); + MapMaker mapMaker = new MapMaker().weakValues(); + if (maxSize != -1) { + mapMaker.maximumSize(maxSize); + } + return mapMaker.makeMap(); } @Override public String type() { diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/weak/WeakFilterCache.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/weak/WeakFilterCache.java index 4975cdb625f..b2e67524b91 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/weak/WeakFilterCache.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/weak/WeakFilterCache.java @@ -37,14 +37,21 @@ import java.util.concurrent.ConcurrentMap; */ public class WeakFilterCache extends AbstractConcurrentMapFilterCache { + private final int maxSize; + @Inject public WeakFilterCache(Index index, @IndexSettings Settings indexSettings) { super(index, indexSettings); + this.maxSize = componentSettings.getAsInt("max_size", -1); } @Override protected ConcurrentMap buildFilterMap() { // DocSet are not really stored with strong reference only when searching on them... // Filter might be stored in query cache - return new MapMaker().weakValues().makeMap(); + MapMaker mapMaker = new MapMaker().weakValues(); + if (maxSize != -1) { + mapMaker.maximumSize(maxSize); + } + return mapMaker.makeMap(); } @Override public String type() {