Skip to content

Commit 5711281

Browse files
committed
Mappings: Fix _field_names to be disabled on pre 1.3.0 indexes
In #9893, an enabled flag was added for _field_names. However, backcompat for indexes created before 1.3.0 (when _field_names was added) was lost. This change corrects the mapper to always be disabled when used with older indexes that cannot have _field_names. closes #10268
1 parent 884d72b commit 5711281

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

src/main/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapper.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ public Mapper.Builder parse(String name, Map<String, Object> node, ParserContext
134134

135135
private final FieldType defaultFieldType;
136136
private EnabledAttributeMapper enabledState;
137+
private final boolean pre13Index; // if the index was created before 1.3, _field_names is always disabled
137138

138139
public FieldNamesFieldMapper(Settings indexSettings) {
139140
this(Defaults.NAME, Defaults.NAME, Defaults.BOOST, new FieldType(Defaults.FIELD_TYPE), null, null, Defaults.ENABLED_STATE, null, indexSettings);
@@ -144,11 +145,12 @@ public FieldNamesFieldMapper(String name, String indexName, float boost, FieldTy
144145
super(new Names(name, indexName, indexName, name), boost, fieldType, null, Lucene.KEYWORD_ANALYZER,
145146
Lucene.KEYWORD_ANALYZER, postingsProvider, docValuesProvider, null, null, fieldDataSettings, indexSettings);
146147
this.defaultFieldType = Defaults.FIELD_TYPE;
148+
this.pre13Index = Version.indexCreated(indexSettings).before(Version.V_1_3_0);
147149
this.enabledState = enabledState;
148150
}
149151

150152
public boolean enabled() {
151-
return enabledState.enabled;
153+
return pre13Index == false && enabledState.enabled;
152154
}
153155

154156
@Override
@@ -255,6 +257,9 @@ protected String contentType() {
255257

256258
@Override
257259
public XContentBuilder toXContent(XContentBuilder builder, Params params) throws IOException {
260+
if (pre13Index) {
261+
return builder;
262+
}
258263
boolean includeDefaults = params.paramAsBoolean("include_defaults", false);
259264

260265
if (includeDefaults == false && fieldType().equals(Defaults.FIELD_TYPE) && enabledState == Defaults.ENABLED_STATE) {

src/test/java/org/elasticsearch/bwcompat/OldIndexBackwardsCompatibilityTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.elasticsearch.common.settings.Settings;
3131
import org.elasticsearch.common.unit.TimeValue;
3232
import org.elasticsearch.index.merge.policy.MergePolicyModule;
33+
import org.elasticsearch.index.query.FilterBuilders;
3334
import org.elasticsearch.index.query.QueryBuilders;
3435
import org.elasticsearch.node.internal.InternalNode;
3536
import org.elasticsearch.rest.action.admin.indices.upgrade.UpgradeTest;
@@ -50,6 +51,7 @@
5051
import java.util.*;
5152

5253
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertAcked;
54+
import static org.hamcrest.CoreMatchers.equalTo;
5355

5456
@TimeoutSuite(millis = 40 * TimeUnits.MINUTE)
5557
public class OldIndexBackwardsCompatibilityTests extends StaticIndexBackwardCompatibilityTest {
@@ -144,6 +146,11 @@ void assertBasicSearchWorks() {
144146

145147
searchReq.addSort("long_sort", SortOrder.ASC);
146148
ElasticsearchAssertions.assertNoFailures(searchReq.get());
149+
150+
searchReq = client().prepareSearch("test").setQuery(QueryBuilders.filteredQuery(QueryBuilders.matchAllQuery(), FilterBuilders.existsFilter("string")));
151+
searchRsp = searchReq.get();
152+
ElasticsearchAssertions.assertNoFailures(searchRsp);
153+
assertThat(numDocs, equalTo(searchRsp.getHits().getTotalHits()));
147154
}
148155

149156
void assertRealtimeGetWorks() {

src/test/java/org/elasticsearch/index/mapper/internal/FieldNamesFieldMapperTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,10 @@
1919

2020
package org.elasticsearch.index.mapper.internal;
2121

22+
import org.elasticsearch.Version;
23+
import org.elasticsearch.cluster.metadata.IndexMetaData;
24+
import org.elasticsearch.common.settings.ImmutableSettings;
25+
import org.elasticsearch.common.settings.Settings;
2226
import org.elasticsearch.common.xcontent.XContentFactory;
2327
import org.elasticsearch.index.mapper.DocumentMapper;
2428
import org.elasticsearch.index.mapper.DocumentMapperParser;
@@ -108,6 +112,14 @@ public void testDisabled() throws Exception {
108112
assertNull(doc.rootDoc().get("_field_names"));
109113
}
110114

115+
public void testPre13Disabled() throws Exception {
116+
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type").endObject().endObject().string();
117+
Settings indexSettings = ImmutableSettings.builder().put(IndexMetaData.SETTING_VERSION_CREATED, Version.V_1_2_4.id).build();
118+
DocumentMapper docMapper = createIndex("test", indexSettings).mapperService().documentMapperParser().parse(mapping);
119+
FieldNamesFieldMapper fieldNamesMapper = docMapper.rootMapper(FieldNamesFieldMapper.class);
120+
assertFalse(fieldNamesMapper.enabled());
121+
}
122+
111123
public void testDisablingBackcompat() throws Exception {
112124
// before 1.5, disabling happened by setting index:no
113125
String mapping = XContentFactory.jsonBuilder().startObject().startObject("type")

0 commit comments

Comments
 (0)