From a47638dd3c2c58c34690de4adb55b3226807ec9b Mon Sep 17 00:00:00 2001 From: kimchy Date: Sat, 11 Sep 2010 00:11:47 +0300 Subject: [PATCH] imrove filter caching handling by not holding an implicit ref to the parent cache --- .../AbstractConcurrentMapFilterCache.java | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/support/AbstractConcurrentMapFilterCache.java b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/support/AbstractConcurrentMapFilterCache.java index 21d358b0141..38b60501d33 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/support/AbstractConcurrentMapFilterCache.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/index/cache/filter/support/AbstractConcurrentMapFilterCache.java @@ -42,7 +42,7 @@ import static org.elasticsearch.common.util.concurrent.ConcurrentCollections.*; */ public abstract class AbstractConcurrentMapFilterCache extends AbstractIndexComponent implements FilterCache { - private final ConcurrentMap> cache; + final ConcurrentMap> cache; protected AbstractConcurrentMapFilterCache(Index index, @IndexSettings Settings indexSettings, ConcurrentMap> cache) { @@ -83,7 +83,10 @@ public abstract class AbstractConcurrentMapFilterCache extends AbstractIndexComp } @Override public Filter cache(Filter filterToCache) { - return new FilterCacheFilterWrapper(filterToCache); + if (isCached(filterToCache)) { + return filterToCache; + } + return new FilterCacheFilterWrapper(filterToCache, this); } @Override public boolean isCached(Filter filter) { @@ -98,19 +101,22 @@ public abstract class AbstractConcurrentMapFilterCache extends AbstractIndexComp // and not use the DeletableConstantScoreQuery, instead pass the DeletesMode enum to the cache method // see: https://issues.apache.org/jira/browse/LUCENE-2468 - private class FilterCacheFilterWrapper extends Filter { + static class FilterCacheFilterWrapper extends Filter { private final Filter filter; - private FilterCacheFilterWrapper(Filter filter) { + private final AbstractConcurrentMapFilterCache cache; + + FilterCacheFilterWrapper(Filter filter, AbstractConcurrentMapFilterCache cache) { this.filter = filter; + this.cache = cache; } @Override public DocIdSet getDocIdSet(IndexReader reader) throws IOException { - ConcurrentMap cachedFilters = cache.get(reader.getFieldCacheKey()); + ConcurrentMap cachedFilters = cache.cache.get(reader.getFieldCacheKey()); if (cachedFilters == null) { - cachedFilters = buildFilterMap(); - cache.putIfAbsent(reader.getFieldCacheKey(), cachedFilters); + cachedFilters = cache.buildFilterMap(); + cache.cache.putIfAbsent(reader.getFieldCacheKey(), cachedFilters); } DocSet docSet = cachedFilters.get(filter); if (docSet != null) {