From 4a3e5b63484c922225c47404a06e415d11c09e2f Mon Sep 17 00:00:00 2001 From: kimchy Date: Tue, 23 Nov 2010 15:26:19 +0200 Subject: [PATCH] Query Cache: Invalidate the query cache when mappings change, closes #532. --- .../org/elasticsearch/cache/NodeCache.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/modules/elasticsearch/src/main/java/org/elasticsearch/cache/NodeCache.java b/modules/elasticsearch/src/main/java/org/elasticsearch/cache/NodeCache.java index 9a2905413bd..32dbd5b91e1 100644 --- a/modules/elasticsearch/src/main/java/org/elasticsearch/cache/NodeCache.java +++ b/modules/elasticsearch/src/main/java/org/elasticsearch/cache/NodeCache.java @@ -21,33 +21,36 @@ package org.elasticsearch.cache; import org.elasticsearch.cache.memory.ByteBufferCache; import org.elasticsearch.cache.query.parser.QueryParserCache; -import org.elasticsearch.cache.query.parser.none.NoneQueryParserCache; +import org.elasticsearch.cluster.ClusterChangedEvent; +import org.elasticsearch.cluster.ClusterService; +import org.elasticsearch.cluster.ClusterStateListener; import org.elasticsearch.common.component.AbstractComponent; import org.elasticsearch.common.inject.Inject; -import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; /** * @author kimchy (shay.banon) */ -public class NodeCache extends AbstractComponent { +public class NodeCache extends AbstractComponent implements ClusterStateListener { + + private final ClusterService clusterService; private final ByteBufferCache byteBufferCache; private final QueryParserCache queryParserCache; - public NodeCache() { - this(ImmutableSettings.Builder.EMPTY_SETTINGS, new ByteBufferCache(ImmutableSettings.Builder.EMPTY_SETTINGS), new NoneQueryParserCache()); - } - - @Inject public NodeCache(Settings settings, ByteBufferCache byteBufferCache, QueryParserCache queryParserCache) { + @Inject public NodeCache(Settings settings, ByteBufferCache byteBufferCache, QueryParserCache queryParserCache, ClusterService clusterService) { super(settings); + this.clusterService = clusterService; this.byteBufferCache = byteBufferCache; this.queryParserCache = queryParserCache; + clusterService.add(this); } public void close() { + clusterService.remove(this); byteBufferCache.close(); + queryParserCache.clear(); } public ByteBufferCache byteBuffer() { @@ -57,4 +60,12 @@ public class NodeCache extends AbstractComponent { public QueryParserCache queryParser() { return queryParserCache; } + + // listen on cluster change events to invalidate the query parser cache + @Override public void clusterChanged(ClusterChangedEvent event) { + // TODO we can do better by detecting just mappings changes + if (event.metaDataChanged()) { + queryParserCache.clear(); + } + } }