From e759b4c9715e067d73e91b998e7396ec078fc33f Mon Sep 17 00:00:00 2001 From: kimchy Date: Tue, 22 Mar 2011 13:14:31 +0200 Subject: [PATCH] Add option to expire filter's cache based on access time, closes #803. --- .../cache/filter/resident/ResidentFilterCache.java | 11 +++++++++++ .../index/cache/filter/soft/SoftFilterCache.java | 11 +++++++++++ .../index/cache/filter/weak/WeakFilterCache.java | 8 ++++++++ 3 files changed, 30 insertions(+) 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 index ce78ae1c8e8..2ccf854f0eb 100644 --- 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 @@ -24,11 +24,13 @@ 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.common.unit.TimeValue; import org.elasticsearch.index.Index; import org.elasticsearch.index.cache.filter.support.AbstractDoubleConcurrentMapFilterCache; import org.elasticsearch.index.settings.IndexSettings; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; /** * A resident reference based filter cache that has soft keys on the IndexReader. @@ -39,9 +41,12 @@ public class ResidentFilterCache extends AbstractDoubleConcurrentMapFilterCache private final int maxSize; + private final TimeValue expire; + @Inject public ResidentFilterCache(Index index, @IndexSettings Settings indexSettings) { super(index, indexSettings); this.maxSize = componentSettings.getAsInt("max_size", 1000); + this.expire = componentSettings.getAsTime("expire", null); } @Override protected ConcurrentMap buildCacheMap() { @@ -49,6 +54,9 @@ public class ResidentFilterCache extends AbstractDoubleConcurrentMapFilterCache if (maxSize != -1) { mapMaker.maximumSize(maxSize); } + if (expire != null) { + mapMaker.expireAfterAccess(expire.nanos(), TimeUnit.NANOSECONDS); + } return mapMaker.makeMap(); } @@ -59,6 +67,9 @@ public class ResidentFilterCache extends AbstractDoubleConcurrentMapFilterCache if (maxSize != -1) { mapMaker.maximumSize(maxSize); } + if (expire != null) { + mapMaker.expireAfterAccess(expire.nanos(), TimeUnit.NANOSECONDS); + } return mapMaker.makeMap(); } 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 287449dfc9b..53b6884947f 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 @@ -24,11 +24,13 @@ 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.common.unit.TimeValue; import org.elasticsearch.index.Index; import org.elasticsearch.index.cache.filter.support.AbstractDoubleConcurrentMapFilterCache; import org.elasticsearch.index.settings.IndexSettings; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; /** * A soft reference based filter cache that has soft keys on the IndexReader. @@ -39,9 +41,12 @@ public class SoftFilterCache extends AbstractDoubleConcurrentMapFilterCache { private final int maxSize; + private final TimeValue expire; + @Inject public SoftFilterCache(Index index, @IndexSettings Settings indexSettings) { super(index, indexSettings); this.maxSize = componentSettings.getAsInt("max_size", -1); + this.expire = componentSettings.getAsTime("expire", null); } @Override protected ConcurrentMap buildCacheMap() { @@ -51,6 +56,9 @@ public class SoftFilterCache extends AbstractDoubleConcurrentMapFilterCache { if (maxSize != -1) { mapMaker.maximumSize(maxSize); } + if (expire != null) { + mapMaker.expireAfterAccess(expire.nanos(), TimeUnit.NANOSECONDS); + } return mapMaker.makeMap(); } @@ -61,6 +69,9 @@ public class SoftFilterCache extends AbstractDoubleConcurrentMapFilterCache { if (maxSize != -1) { mapMaker.maximumSize(maxSize); } + if (expire != null) { + mapMaker.expireAfterAccess(expire.nanos(), TimeUnit.NANOSECONDS); + } return mapMaker.makeMap(); } 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 b2e67524b91..5036ad49e5e 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 @@ -24,11 +24,13 @@ 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.common.unit.TimeValue; import org.elasticsearch.index.Index; import org.elasticsearch.index.cache.filter.support.AbstractConcurrentMapFilterCache; import org.elasticsearch.index.settings.IndexSettings; import java.util.concurrent.ConcurrentMap; +import java.util.concurrent.TimeUnit; /** * A weak reference based filter cache that has weak keys on the IndexReader. @@ -39,9 +41,12 @@ public class WeakFilterCache extends AbstractConcurrentMapFilterCache { private final int maxSize; + private final TimeValue expire; + @Inject public WeakFilterCache(Index index, @IndexSettings Settings indexSettings) { super(index, indexSettings); this.maxSize = componentSettings.getAsInt("max_size", -1); + this.expire = componentSettings.getAsTime("expire", null); } @Override protected ConcurrentMap buildFilterMap() { @@ -51,6 +56,9 @@ public class WeakFilterCache extends AbstractConcurrentMapFilterCache { if (maxSize != -1) { mapMaker.maximumSize(maxSize); } + if (expire != null) { + mapMaker.expireAfterAccess(expire.nanos(), TimeUnit.NANOSECONDS); + } return mapMaker.makeMap(); }