Skip to content

Commit 1199310

Browse files
Load field infos from directory if not yet cached on IndexShard
If we don't yet have a cached value ready to go for the field infos, lets load it from the directory. Fixes elastic#125383
1 parent d9008cd commit 1199310

File tree

2 files changed

+23
-8
lines changed

2 files changed

+23
-8
lines changed

server/src/main/java/org/elasticsearch/index/shard/IndexShard.java

+18-8
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,6 @@ public IndexShard(
418418
this.refreshFieldHasValueListener = new RefreshFieldHasValueListener();
419419
this.relativeTimeInNanosSupplier = relativeTimeInNanosSupplier;
420420
this.indexCommitListener = indexCommitListener;
421-
this.fieldInfos = FieldInfos.EMPTY;
422421
}
423422

424423
public ThreadPool getThreadPool() {
@@ -1025,7 +1024,11 @@ public void setFieldInfos(FieldInfos fieldInfos) {
10251024
}
10261025

10271026
public FieldInfos getFieldInfos() {
1028-
return fieldInfos;
1027+
var res = fieldInfos;
1028+
if (res == null) {
1029+
return loadFieldInfos();
1030+
}
1031+
return res;
10291032
}
10301033

10311034
public static Engine.Index prepareIndex(
@@ -4131,16 +4134,23 @@ public void beforeRefresh() {}
41314134

41324135
@Override
41334136
public void afterRefresh(boolean didRefresh) {
4134-
if (enableFieldHasValue && (didRefresh || fieldInfos == FieldInfos.EMPTY)) {
4135-
try (Engine.Searcher hasValueSearcher = getEngine().acquireSearcher("field_has_value")) {
4136-
setFieldInfos(FieldInfos.getMergedFieldInfos(hasValueSearcher.getIndexReader()));
4137-
} catch (AlreadyClosedException ignore) {
4138-
// engine is closed - no updated FieldInfos is fine
4139-
}
4137+
if (enableFieldHasValue && (didRefresh || fieldInfos == null)) {
4138+
loadFieldInfos();
41404139
}
41414140
}
41424141
}
41434142

4143+
private FieldInfos loadFieldInfos() {
4144+
try (Engine.Searcher hasValueSearcher = getEngine().acquireSearcher("field_has_value")) {
4145+
var res = FieldInfos.getMergedFieldInfos(hasValueSearcher.getIndexReader());
4146+
setFieldInfos(res);
4147+
return res;
4148+
} catch (AlreadyClosedException ignore) {
4149+
// engine is closed - no update to3 FieldInfos is fine
4150+
}
4151+
return FieldInfos.EMPTY;
4152+
}
4153+
41444154
/**
41454155
* Returns the shard-level field stats, which includes the number of segments in the latest NRT reader of this shard
41464156
* and the total number of fields across those segments.

x-pack/plugin/searchable-snapshots/src/internalClusterTest/java/org/elasticsearch/xpack/searchablesnapshots/SearchableSnapshotsSearchIntegTests.java

+5
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
package org.elasticsearch.xpack.searchablesnapshots;
99

10+
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesResponse;
1011
import org.elasticsearch.action.index.IndexRequestBuilder;
1112
import org.elasticsearch.action.search.SearchRequest;
1213
import org.elasticsearch.action.search.SearchType;
@@ -125,5 +126,9 @@ public void testKeywordSortedQueryOnFrozen() throws Exception {
125126
assertThat(searchResponse.getTotalShards(), equalTo(20));
126127
assertThat(searchResponse.getHits().getTotalHits().value(), equalTo(4L));
127128
});
129+
130+
// check that field_caps empty field filtering works as well
131+
FieldCapabilitiesResponse response = client().prepareFieldCaps(mountedIndices).setFields("*").setincludeEmptyFields(false).get();
132+
assertNotNull(response.getField("keyword"));
128133
}
129134
}

0 commit comments

Comments
 (0)