Skip to content

Commit 6b92b59

Browse files
committed
allow to clear by reader the new field data cache
1 parent c67386f commit 6b92b59

File tree

5 files changed

+29
-1
lines changed

5 files changed

+29
-1
lines changed

src/main/java/org/elasticsearch/index/fielddata/AbstractIndexFieldData.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package org.elasticsearch.index.fielddata;
22

3+
import org.apache.lucene.index.IndexReader;
34
import org.elasticsearch.common.settings.Settings;
45
import org.elasticsearch.index.AbstractIndexComponent;
56
import org.elasticsearch.index.Index;
@@ -30,4 +31,9 @@ public FieldMapper.Names getFieldNames() {
3031
public void clear() {
3132
cache.clear(index, fieldNames.indexName());
3233
}
34+
35+
@Override
36+
public void clear(IndexReader reader) {
37+
cache.clear(index, reader);
38+
}
3339
}

src/main/java/org/elasticsearch/index/fielddata/IndexFieldData.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.index.fielddata;
2121

2222
import org.apache.lucene.index.AtomicReaderContext;
23+
import org.apache.lucene.index.IndexReader;
2324
import org.apache.lucene.search.FieldComparatorSource;
2425
import org.apache.lucene.search.SortField;
2526
import org.elasticsearch.common.Nullable;
@@ -63,6 +64,8 @@ public interface IndexFieldData<FD extends AtomicFieldData> extends IndexCompone
6364
*/
6465
void clear();
6566

67+
void clear(IndexReader reader);
68+
6669
// we need this extended source we we have custom comparators to reuse our field data
6770
// in this case, we need to reduce type that will be used when search results are reduced
6871
// on another node (we don't have the custom source them...)

src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataCache.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.google.common.cache.Cache;
2323
import com.google.common.cache.CacheBuilder;
2424
import org.apache.lucene.index.AtomicReaderContext;
25+
import org.apache.lucene.index.IndexReader;
2526
import org.apache.lucene.index.SegmentReader;
2627
import org.elasticsearch.index.Index;
2728

@@ -38,6 +39,8 @@ public interface IndexFieldDataCache {
3839

3940
void clear(Index index, String fieldName);
4041

42+
void clear(Index index, IndexReader reader);
43+
4144
/**
4245
* The resident field data cache is a *per field* cache that keeps all the values in memory.
4346
*/
@@ -76,6 +79,11 @@ public void clear(Index index) {
7679
public void clear(Index index, String fieldName) {
7780
cache.invalidateAll();
7881
}
82+
83+
@Override
84+
public void clear(Index index, IndexReader reader) {
85+
cache.invalidate(reader.getCoreCacheKey());
86+
}
7987
}
8088

8189
static class Resident extends FieldBased {

src/main/java/org/elasticsearch/index/fielddata/IndexFieldDataService.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
package org.elasticsearch.index.fielddata;
2121

2222
import com.google.common.collect.ImmutableMap;
23+
import org.apache.lucene.index.IndexReader;
2324
import org.elasticsearch.ElasticSearchIllegalArgumentException;
2425
import org.elasticsearch.common.collect.MapBuilder;
2526
import org.elasticsearch.common.collect.Tuple;
@@ -96,6 +97,12 @@ public void clearField(String fieldName) {
9697
}
9798
}
9899

100+
public void clear(IndexReader reader) {
101+
for (IndexFieldData indexFieldData : loadedFieldData.values()) {
102+
indexFieldData.clear(reader);
103+
}
104+
}
105+
99106
public FieldDataStats stats() {
100107
// TODO: compute the memory size here...
101108
return new FieldDataStats();

src/main/java/org/elasticsearch/index/percolator/PercolatorExecutor.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.elasticsearch.index.fielddata.BytesValues;
5050
import org.elasticsearch.index.fielddata.FieldDataType;
5151
import org.elasticsearch.index.fielddata.IndexFieldData;
52+
import org.elasticsearch.index.fielddata.IndexFieldDataService;
5253
import org.elasticsearch.index.mapper.*;
5354
import org.elasticsearch.index.mapper.internal.UidFieldMapper;
5455
import org.elasticsearch.index.query.IndexQueryParserService;
@@ -153,6 +154,7 @@ public List<String> matches() {
153154
private final IndexQueryParserService queryParserService;
154155

155156
private final IndexCache indexCache;
157+
private final IndexFieldDataService fieldDataService;
156158

157159
private final Map<String, Query> queries = ConcurrentCollections.newConcurrentMap();
158160

@@ -162,11 +164,12 @@ public List<String> matches() {
162164
@Inject
163165
public PercolatorExecutor(Index index, @IndexSettings Settings indexSettings,
164166
MapperService mapperService, IndexQueryParserService queryParserService,
165-
IndexCache indexCache) {
167+
IndexCache indexCache, IndexFieldDataService fieldDataService) {
166168
super(index, indexSettings);
167169
this.mapperService = mapperService;
168170
this.queryParserService = queryParserService;
169171
this.indexCache = indexCache;
172+
this.fieldDataService = fieldDataService;
170173
}
171174

172175
public void setIndicesService(IndicesService indicesService) {
@@ -347,6 +350,7 @@ private Response percolate(DocAndQueryRequest request) throws ElasticSearchExcep
347350
} finally {
348351
// explicitly clear the reader, since we can only register on callback on SegmentReader
349352
indexCache.clear(searcher.getIndexReader());
353+
fieldDataService.clear(searcher.getIndexReader());
350354
}
351355

352356
return new Response(matches, request.doc().mappingsModified());

0 commit comments

Comments
 (0)