Skip to content

Commit d0f420b

Browse files
danielmitterdorferkcm
authored andcommitted
Allow to clear the fielddata cache per field
With this commit we clear the fielddata cache per field as it is supposed to be. Previously we retrieved the proper field from the cache but then cleared the entire cache anyway. Closes #33798 Relates #33807
1 parent 4c02a91 commit d0f420b

File tree

2 files changed

+61
-1
lines changed

2 files changed

+61
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public synchronized void clearField(final String fieldName) {
9797
final IndexFieldDataCache cache = fieldDataCaches.remove(fieldName);
9898
if (cache != null) {
9999
try {
100-
cache.clear();
100+
cache.clear(fieldName);
101101
} catch (Exception e) {
102102
exceptions.add(e);
103103
}

server/src/test/java/org/elasticsearch/index/fielddata/IndexFieldDataServiceTests.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,66 @@ public void testGetForFieldDefaults() {
100100
assertTrue(fd instanceof SortedNumericDVIndexFieldData);
101101
}
102102

103+
public void testClearField() throws Exception {
104+
final IndexService indexService = createIndex("test");
105+
final IndicesService indicesService = getInstanceFromNode(IndicesService.class);
106+
// copy the ifdService since we can set the listener only once.
107+
final IndexFieldDataService ifdService = new IndexFieldDataService(indexService.getIndexSettings(),
108+
indicesService.getIndicesFieldDataCache(), indicesService.getCircuitBreakerService(), indexService.mapperService());
109+
110+
final BuilderContext ctx = new BuilderContext(indexService.getIndexSettings().getSettings(), new ContentPath(1));
111+
final MappedFieldType mapper1 = new TextFieldMapper.Builder("field_1").fielddata(true).build(ctx).fieldType();
112+
final MappedFieldType mapper2 = new TextFieldMapper.Builder("field_2").fielddata(true).build(ctx).fieldType();
113+
final IndexWriter writer = new IndexWriter(new RAMDirectory(), new IndexWriterConfig(new KeywordAnalyzer()));
114+
Document doc = new Document();
115+
doc.add(new StringField("field_1", "thisisastring", Store.NO));
116+
doc.add(new StringField("field_2", "thisisanotherstring", Store.NO));
117+
writer.addDocument(doc);
118+
final IndexReader reader = DirectoryReader.open(writer);
119+
final AtomicInteger onCacheCalled = new AtomicInteger();
120+
final AtomicInteger onRemovalCalled = new AtomicInteger();
121+
ifdService.setListener(new IndexFieldDataCache.Listener() {
122+
@Override
123+
public void onCache(ShardId shardId, String fieldName, Accountable ramUsage) {
124+
onCacheCalled.incrementAndGet();
125+
}
126+
127+
@Override
128+
public void onRemoval(ShardId shardId, String fieldName, boolean wasEvicted, long sizeInBytes) {
129+
onRemovalCalled.incrementAndGet();
130+
}
131+
});
132+
IndexFieldData<?> ifd1 = ifdService.getForField(mapper1);
133+
IndexFieldData<?> ifd2 = ifdService.getForField(mapper2);
134+
LeafReaderContext leafReaderContext = reader.getContext().leaves().get(0);
135+
AtomicFieldData loadField1 = ifd1.load(leafReaderContext);
136+
AtomicFieldData loadField2 = ifd2.load(leafReaderContext);
137+
138+
assertEquals(2, onCacheCalled.get());
139+
assertEquals(0, onRemovalCalled.get());
140+
141+
ifdService.clearField("field_1");
142+
143+
assertEquals(2, onCacheCalled.get());
144+
assertEquals(1, onRemovalCalled.get());
145+
146+
ifdService.clearField("field_1");
147+
148+
assertEquals(2, onCacheCalled.get());
149+
assertEquals(1, onRemovalCalled.get());
150+
151+
ifdService.clearField("field_2");
152+
153+
assertEquals(2, onCacheCalled.get());
154+
assertEquals(2, onRemovalCalled.get());
155+
156+
reader.close();
157+
loadField1.close();
158+
loadField2.close();
159+
writer.close();
160+
ifdService.clear();
161+
}
162+
103163
public void testFieldDataCacheListener() throws Exception {
104164
final IndexService indexService = createIndex("test");
105165
final IndicesService indicesService = getInstanceFromNode(IndicesService.class);

0 commit comments

Comments
 (0)